Oracle 绑定变量示例

2014-11-24 18:02:22 · 作者: · 浏览: 0

Oracle 绑定变量详解





在这里演示一下绑定变量的例子, 注意,绑定变量对索引选择性不好的列不适用,可能会导致错误的执行计划,从而影响SQL 效率。



有关索引的选择性,参考:


Oracle 索引的维护




示例



SQL> create table t1(c1 number,c2 number,c3 number,c4 number);


Table created.



SQL> declare


2 i number;


3 j number;


4 str varchar2(200);


5 begin


6 i :=1;


7 j :=2;


8 str :='insert into t1 values(:x,:y,:x,:y)';


9 execute immediate str using i,j,i,j;


10 end;


11 /



PL/SQL procedure successfully completed.



SQL> select * from t1;



C1 C2 C3 C4


---------- ---------- ---------- ----------


1 2 1 2



这里是绑定变量的一个简单应用, 绑定变量起到占位的作用.



进一步的测试:ORACLE系统本身是能够对变量做绑定的。



SQL> set timing on


SQL> declare


2 i number;


3 begin


4 for i in 1..1000 loop


5 insert into t1 values(i,i+1,i+2,i+3);


6 end loop;


7 end;


8 /



PL/SQL procedure successfully completed.


Elapsed: 00:00:00.28



SQL> select count(*) from t1;


COUNT(*)


----------


1001



Elapsed: 00:00:00.01



在这段代码块的执行过程中,ORACLE会自动将其中的变量进行绑定。 也就是说:这段代码执行了1000 insert 语句,但是每次发出去的语句都是一样的,1000SQLhash 值是一样的,他们的执行计划也是一样的。




对上述代码进行修改:



SQL> declare


2 i number;


3 str varchar2(200);


4 begin


5 for i in 1..1000 loop


6 str:='insert into t1 values ('||to_char(i)||','||to_char(i)||'+1,'||to_char(i)||'+2,'||to_char(i)||'+3)';


7 execute immediate str;


8 end loop;


9 end;


10 /



PL/SQL procedure successfully completed.



Elapsed: 00:00:02.88



这段代码没有自动使用绑定变量,所以时间上明显长。 我们使用绑定变量看看。



SQL> declare


2 i number;


3 str varchar2(200);


4 begin


5 for i in 1..1000 loop


6 str:='insert into t1 values (:i,:i+1,:i+2,:i+3)';


7 execute immediate str using i,i,i,i;


8 end loop;


9 end;


10 /



PL/SQL procedure successfully completed.



Elapsed: 00:00:00.19



使用绑定变量后,时间明显要少很多。