关于 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 表示宿主变量,对吗?
考虑一下这段 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_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;
/
Run Code Online (Sandbox Code Playgroud)
同样,声明的变量v_empno和v_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 中进行区分,编译器会为您处理好。