关于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 :(得分: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_empno
和v_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_empno
和v_ename
可以被认为是主变量,但是当它们在PL / SQL代码中的静态SQL中使用时,它们会被PL /自动转换为绑定变量SQL编译器/引擎 - 您不必像在C#示例中那样手动创建绑定变量。如果检查这个PL / SQL实际执行的SQL,它将如下所示:
select e.ename
from scott.emp e
where e.empno = :B1
这是PL / SQL编译器,它自动为:B1
PL / SQL变量创建了v_empno
绑定变量。这就是Tom Kyte意味着你无法在PL / SQL中真正区分主变量和绑定变量。当您编写PL / SQL时,变量在PL / SQL代码中使用时是主变量,同时在嵌入式SQL代码中使用时它们是绑定变量。您不需要在PL / SQL中进行区分,编译器会为您处理它。
答案 1 :(得分:3)
主机变量是主机程序与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
答案 2 :(得分:1)
绑定/主机变量仅适用于embedded SQL/PLSQL
...
Bind
实际上是从您的接口(Java或Pro * C)向Oracle发送一些值..
Host
是您的界面中定义的变量,从Oracle获取其值...
所以你的陈述是荒谬的。
使用变量本身的PL/SQL
块中的任何静态 SQL将以类似于绑定变量的方式隐式使用..
- 这意味着下一次执行此SQL可以重新使用该计划 在自适应游标共享的情况下,将共享游标..
..因此,使用PL / SQL(直接在Oracle中执行,而不是通过JDBC或任何基于OCI执行), NO 从字面上绑定变量。除非您有动态SQL。
示例:
EXECUTE IMMEDIATE 'SELECT NAME FROM EMP WHERE ID = : ID' USING V_MYID
此处:ID
是绑定变量----(接受来自调用者的查询值)
并且V_MYID
是主机变量.....(在调用者/主机本身中定义)
该概念与其他嵌入式SQL原则类似。