关于PLSQL,'Host Variable‘和'Bind Variable’有什么区别?
这个来自askTom的link说“plsql中的区别变得模糊了--它非常接近sql”。那么,这种微小的“模糊”区别是什么呢?
语句1:
SELECT 1 FROM dual WHERE dummy = :B1;语句2:
SELECT 1 FROM dual WHERE dummy = v_var;在这两条语句中,语句1表示绑定变量,语句2表示主机变量,对吗?
发布于 2014-10-08 21:34:22
考虑一下这段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这就是为v_empno PL/SQL变量自动创建:B1绑定变量的PL/SQL编译器。这就是Tom Kyte的意思,你不能在PL/SQL中正确区分主机变量和绑定变量。在编写PL/SQL时,变量在PL/SQL代码中使用时是主机变量,同时在嵌入式SQL代码中使用时是绑定变量。您不需要在PL/SQL中进行区分,编译器会为您处理它。
发布于 2014-10-08 20:40:07
主机变量是主机程序和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
发布于 2014-10-08 23:59:45
绑定/主机变量仅适用于embedded SQL/PLSQL...
Bind实际上是从您的接口(Java或Pro*C)向Oracle发送一些值。
Host是在您的接口中定义的变量,它的值来自Oracle...
所以你的陈述是荒谬的。
PL/SQL块中使用变量本身的任何静态SQL都将以类似于绑定变量的方式隐式使用。
--这意味着该SQL的下一次执行可以重用该计划,游标将被共享。在自适应游标共享的情况下..
。。因此,对于PL/SQL(直接在Oracle中执行,而不是通过JDBC或任何基于OCI的),从字面上看没有绑定变量。除非你有一个动态SQL。
示例:
EXECUTE IMMEDIATE 'SELECT NAME FROM EMP WHERE ID = : ID' USING V_MYID这里的:ID是绑定变量-(接受来自调用者的查询的值)
而V_MYID是主机变量.....(在调用者/主机本身中定义)
该概念与其他嵌入式SQL原则类似。
https://stackoverflow.com/questions/26256597
复制相似问题