绑定变量在静态sql和动态sql中

关于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

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1053047/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25362835/viewspace-1053047/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值