关于PLSQL,'主机变量'和'绑定变量'有什么区别?PLSQL绑定变量和主机变量之间的区别
askTom的link表示“plsql中的区别模糊 - 它非常接近sql”。那么,这种微小的“模糊”差异是什么?
声明1:
SELECT 1 FROM dual WHERE dummy = :B1;
声明2:
SELECT 1 FROM dual WHERE dummy = v_var;
在这两个报表,表1表示一个绑定变量和语句2表示主机变量,对吗?
关于PLSQL,'主机变量'和'绑定变量'有什么区别?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
这是自动创造:B1
绑定变量为您v_empno
PL的PL/SQL编译器/ SQL变量。这就是Tom Kyte的意思,你不能在PL/SQL中真正地区分主变量和绑定变量。当您编写PL/SQL时,变量是在PL/SQL代码中使用时的宿主变量,同时它们是在嵌入式SQL代码中使用时的绑定变量。您不需要在PL/SQL中做出区分,编译器会为您处理它。
主机变量是你的主机程序和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
绑定/主机变量仅适用于embedded SQL/PLSQL
...
Bind
实际上是把从你的接口一定的价值(Java或PRO * C)到Oracle ..
Host
是定义的变量您接口,并从甲骨文获得它的价值...
因此,你的声明是荒谬的。
中的变量本身PL/SQL
阻止任何静态 SQL,将类似于绑定变量的方式隐含使用..
--IT意味着这个SQL可以重新使用的一次执行计划和 光标将被共享..在自适应光标共享情况..
..因此,利用PL/SQL(在Oracle直接执行,而不是通过JDBC或任何基于OCI)有NO字面上的绑定变量..除非你有一个动态的SQL。
实施例:
EXECUTE IMMEDIATE 'SELECT NAME FROM EMP WHERE ID = : ID' USING V_MYID
这里:ID
被绑定变量----(接受来自呼叫者值到查询)
和V_MYID
是宿主变量.....(定义于主叫/主机本身)
的概念类似于其他嵌入式SQL原则..
绑定/主机变量仅适用于'嵌入式SQL/PLSQL' ...'乙ind'实际上是从你的接口(Java或Pro * C)向Oracle发送一些值。而'Host'是你的接口中的变量定义,并从Oracle获得它的价值......所以你的陈述变得荒谬。 “PL/SQL”中的任何_static_ SQL块都使用变量本身,将以类似于绑定变量的方式隐式使用。(实际上是解析的SQL/Plan ..)..因此,使用PL/SQL(在Oracle中执行直接而不是通过JDBC或任何OCI基础)那里_NO_字面上的绑定变量..除非你有一个动态的SQL。 – 2014-10-08 15:53:34