繫結變數在靜態sql和動態sql中

dotaddjj發表於2011-07-26

關於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章