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;
/
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
3条答案
按热度按时间x9ybnkn61#
考虑以下C#代码片段:
v_empno
和v_ename
是主机变量。在这里,您显式地创建绑定变量,以在the语句中用作:1
。考虑一下PL/SQL的这个片段:
同样,声明的变量
v_empno
和v_ename
可以被认为是主机变量,但是当它们在PL/SQL代码中的静态SQL中使用时,它们会被PL/SQL编译器/引擎自动转换为绑定变量-您不必像C#示例中那样手动创建绑定变量。如果你检查这个PL/SQL实际执行的SQL,它看起来像这样:这是PL/SQL编译器,它自动为
v_empno
PL/SQL变量创建了:B1
绑定变量。这就是Tom Kyte的意思,在PL/SQL中,你不能真正正确地区分主机变量和绑定变量。在编写PL/SQL时,变量在PL/SQL代码中使用时是主机变量,同时在嵌入式SQL代码中使用时是绑定变量。您不需要在PL/SQL中进行区分,编译器会为您处理它。sqougxex2#
根据文件
主机变量是主机程序与Oracle之间通信的关键。通常,预编译器程序将数据从主机变量输入到Oracle,并且Oracle将数据输出到程序中的主机变量。Oracle将输入数据存储在数据库列中,将输出数据存储在程序主机变量中。
宿主变量可以是解析为标量类型的任意C表达式。但是,主机变量也必须是左值。还支持大多数主机变量的主机数组。
Bind variables不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。PL/SQL本身负责处理绑定变量的大部分问题。每个对PL/SQL变量的引用实际上都是一个绑定变量。
例如:
您可以看到类似的问题here
3wabscal3#
绑定/主机变量仅适用于
embedded SQL/PLSQL
...Bind
实际上是从您的接口(Java或Pro*C)向Oracle发送一些值。Host
是在接口中定义的变量,并从Oracle获取其值...所以你的陈述很荒谬。
在
PL/SQL
块中使用变量本身的任何 static SQL都将以类似于绑定变量的方式隐式使用。--这意味着下一次执行此SQL可以重用该计划,并且游标将被共享。如果是自适应光标共享..
因此,使用PL/SQL(直接在Oracle中执行,而不是通过JDBC或任何基于OCI的),字面上 NO 绑定变量。除非你有一个动态SQL。
示例:
这里
:ID
是绑定变量----(接受来自调用者的查询值)V_MYID
是主机变量.....(在调用者/主机本身中定义)这个概念类似于其他嵌入式SQL原则。