关于oracle的中绑定变量
oracle中的sql分为静态和动态sql,静态sql是已经编译成功直接执行的sql,动态sql在程序执行时才进行编译。
ITPUB一个版主提到oracle的所有静态sql都是软解析,动态sql可以由程序设计者来掌握是否是软解析和硬解析。
依个人来看前半句可能需要实践后半句确实是存在的,下面的代码中我就利用动态sql来让sql使用绑定变量来进行软解析。动态sql比静态sql灵活可以解决静态sql无法解决的问题,比如对数据字典的读取。
oracle中的sql的执行计划:在shared pool中查找是否有sql的缓存明确的应该是在库缓存中查找,库缓存中保留pl/sql和sql代码,有则直接进行软解析,没有则需要进行硬解析。
那么使用绑定变量能做什么了,最主要的应该就是让sql尽量的软解析,减少系统时间,减少cpu资源和sga的消耗。
在sql*plus中用variable使用绑定变量,其实不指定个人也理解的是使用绑定变量
sql>variable no_stu varchar2(50)
sql>exec :no_stu:='02';
sql>select * from student where no_stu=:no_stu;
在动态sql的procedure中就要利用execute immediate using来使用绑定变量了,静态sql的procedure也是默认使用的绑定变量。
select子句中绑定
create or replace procedure test_into_procedure_001
(
v_ab in varchar2,
v_ac in varchar2
)
as
v_ad varchar2(10);
v_ae varchar2(10);
sql_in varchar2(100);
begin
sql_in:='select * from student where no_stu=:1 and name_stu=:2';
execute immediate sql_in using v_ab,v_ac;
dbms_output.put_line(v_ad||' '||v_ae);
end;
execute procedure test_into_procedure_001 编译成功
update子句中绑定,编译成功但是execute提示绑定变量不存在。但是个人确实看不出里面的错误,希望有见解的跟俺扫盲。
create or replace procedure test_into_procedure_002
(
v_ab in varchar2,
v_ac in varchar2
)
as
v_ad varchar2(10);
v_ae varchar2(10);
sql_in varchar2(100);
begin
sql_in:='update student set no_stu=02,name_stu=SF where no_stu=:1 and name_stu=:2';
execute immediate sql_in using v_ab,v_ac returning into v_ad,v_ae;
dbms_output.put_line(v_ad||' '||v_ae);
end;
execute procedure test_into_procedure_001 编译成功
上述的procedure中注意都使用execute immediate动态sql,其中的:1和:2都是可以理解pl/sql中的形式参数,实际参数是利用绑定变量的using后传递的参数。
我们可以在sql中开启set timing on来查看具体的时间
SQL> set timing on;
SQL> execute test_into_procedure_001('02','Sf');
PL/SQL procedure successfully completed
Executed in 0 seconds
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1053047/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1053047/