2014-10-08 79 views
4

关于PLSQL,'主机变量'和'绑定变量'有什么区别?PLSQL绑定变量和主机变量之间的区别

askTom的link表示“plsql中的区别模糊 - 它非常接近sql”。那么,这种微小的“模糊”差异是什么?

声明1:

SELECT 1 FROM dual WHERE dummy = :B1; 

声明2:

SELECT 1 FROM dual WHERE dummy = v_var; 

在这两个报表,表1表示一个绑定变量和语句2表示主机变量,对吗?

+0

绑定/主机变量仅适用于'嵌入式SQL/PLSQL' ...'乙ind'实际上是从你的接口(Java或Pro * C)向Oracle发送一些值。而'Host'是你的接口中的变量定义,并从Oracle获得它的价值......所以你的陈述变得荒谬。 “PL/SQL”中的任何_static_ SQL块都使用变量本身,将以类似于绑定变量的方式隐式使用。(实际上是解析的SQL/Plan ..)..因此,使用PL/SQL(在Oracle中执行直接而不是通过JDBC或任何OCI基础)那里_NO_字面上的绑定变量..除非你有一个动态的SQL。 – 2014-10-08 15:53:34

回答

4

考虑的C#这个片断:

int v_empno = 7369; 
string v_ename; 

OracleCommand cmd = con.CreateCommand(); 
cmd.Parameters.Add("paramEmpno", OracleDbType.Decimal, v_empno, ParameterDirection.Input); 
cmd.CommandText = "select e.ename from scott.emp e where e.empno = :1"; 
v_ename = cmd.ExecuteScalar().ToString(); 

v_empnov_ename是主机变量。在这里你明确地创建了你的声明中用作:1的绑定变量。

考虑这个片段中PL/SQL的:

declare 
    v_empno number := 7369; 
    v_ename varchar2(10); 
begin 
    select e.ename 
    into v_ename 
    from scott.emp e 
    where e.empno = v_empno; 
    dbms_output.put_line(v_ename); 
end; 
/

再次声明的变量v_empnov_ename可以考虑主变量,但是当它们在PL/SQL代码中的静态SQL时,它们会自动通过PL/SQL编译器/引擎转换为绑定变量 - 您不必像C#示例中那样手动创建绑定变量。如果您检查实际上是由这片PL/SQL的执行的SQL,它会是这个样子:

select e.ename 
    from scott.emp e 
    where e.empno = :B1 

这是自动创造:B1绑定变量为您v_empno PL的PL/SQL编译器/ SQL变量。这就是Tom Kyte的意思,你不能在PL/SQL中真正地区分主变量和绑定变量。当您编写PL/SQL时,变量是在PL/SQL代码中使用时的宿主变量,同时它们是在嵌入式SQL代码中使用时的绑定变量。您不需要在PL/SQL中做出区分,编译器会为您处理它。

3

documentation

主机变量是你的主机程序和Oracle之间的主要沟通。通常,预编译器程序将数据从主机变量输入到Oracle,Oracle将数据输出到程序中的主机变量。 Oracle将输入数据存储在数据库列中,并将输出数据存储在程序主机变量中。

主机变量可以是任何解析为标量类型的任意C表达式。但是,主机变量也必须是左值。大多数主机变量的主机数组也受支持。

Bind variables不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。 PL/SQL本身负责处理绑定变量的大部分问题。每一个PL/SQL变量的引用实际上都是一个绑定变量。

例如:

int  empno; 
char ename[10]; 
float sal; 
... 
EXEC SQL SELECT ename, sal INTO :ename, :sal FROM emp 
    WHERE empno = :empno; 

empno, ename, sal are all Host variables 
:empno, :ename, :sal are all bind variables 

你可以看到一个类似的问题here

+1

本文档涉及Pro * C/C++预编译器。我不认为“HOST VARIABLE”这个术语完全适用于PL/SQL。 – Rusty 2014-10-08 14:25:49

+0

非常感谢您的回答,但是,正如@Rusty所指出的,它指的是Pro * C/C++预编译器,而不是PLSQL – Arnab 2014-10-09 06:37:27

1

绑定/主机变量仅适用于embedded SQL/PLSQL ...

Bind实际上是把从你的接口一定的价值(Java或PRO * C)到Oracle ..

Host是定义的变量您接口,并从甲骨文获得它的价值...

因此,你的声明是荒谬的。

中的变量本身PL/SQL阻止任何静态 SQL,将类似于绑定变量的方式隐含使用..

--IT意味着这个SQL可以重新使用的一次执行计划和 光标将被共享..在自适应光标共享情况..

..因此,利用PL/SQL(在Oracle直接执行,而不是通过JDBC或任何基于OCI)有NO字面上的绑定变量..除非你有一个动态的SQL。

实施例:

EXECUTE IMMEDIATE 'SELECT NAME FROM EMP WHERE ID = : ID' USING V_MYID 

这里:ID被绑定变量----(接受来自呼叫者值到查询)
V_MYID是宿主变量.....(定义于主叫/主机本身)

的概念类似于其他嵌入式SQL原则..

相关问题