PLSQL 绑定变量和宿主变量有什么区别

Arn*_*ati 5 oracle plsql

关于 PLSQL,“主机变量”和“绑定变量”有什么区别?

来自 askTom 的这个链接说“plsql 中的区别很模糊——它非常接近 sql”。那么那个微小的、“模糊的”区别是什么?

声明 1:

SELECT 1 FROM dual WHERE dummy = :B1;
Run Code Online (Sandbox Code Playgroud)

声明 2:

SELECT 1 FROM dual WHERE dummy = v_var;
Run Code Online (Sandbox Code Playgroud)

在这两个语句中,语句 1 表示绑定变量,语句 2 表示宿主变量,对吗?

Kim*_*sen 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();
Run Code Online (Sandbox Code Playgroud)

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;
/
Run Code Online (Sandbox Code Playgroud)

同样,声明的变量v_empnov_ename可以被视为主变量,但是当它们在 PL/SQL 代码中的静态 SQL 中使用时,它们会被 PL/SQL 编译器/引擎自动转换为绑定变量 - 您不必手动创建您的变量。像 C# 示例中那样绑定变量。如果您检查这段 PL/SQL 实际执行的 SQL,它将如下所示:

   select e.ename
     from scott.emp e
    where e.empno = :B1
Run Code Online (Sandbox Code Playgroud)

这是 PL/SQL 编译器自动为您的 PL/SQL 变量创建:B1绑定变量v_empno。这就是 Tom Kyte 的意思,您无法真正区分 PL/SQL 中的主变量和绑定变量。当您编写 PL/SQL 时,这些变量在 PL/SQL 代码中使用时是主变量,同时在嵌入式 SQL 代码中使用时它们是绑定变量。您无需在 PL/SQL 中进行区分,编译器会为您处理好。