关于PLsql,“主机变量”和“绑定变量”之间有什么区别?
来自askTom的这个link说“plsql中的区别模糊 – 它非常接近sql”.那么微小的,“模糊”的差异是什么?
声明1:
SELECT 1 FROM dual WHERE dummy = :B1;
声明2:
SELECT 1 FROM dual WHERE dummy = v_var;
在这两个语句中,语句1表示绑定变量,语句2表示主机变量,我是否正确?
解决方法
考虑一下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编译器:用于v_empno PL / sql变量的B1绑定变量.这就是Tom Kyte意味着你无法在PL / sql中真正区分主变量和绑定变量.当您编写PL / sql时,变量在PL / sql代码中使用时是主变量,同时在嵌入式sql代码中使用时它们是绑定变量.您不需要在PL / sql中进行区分,编译器会为您处理它.