繫結變數在靜態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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1053047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server動態SQL,繫結變數SQLServer變數
- C++的動態繫結和靜態繫結C++
- java繼承-靜態繫結和動態繫結Java繼承
- 介面的繫結方案和動態SQLSQL
- 動態繫結和靜態繫結的簡單理解
- 理解靜態繫結與動態繫結
- 靜態變數和非靜態變數變數
- C++ — 靜態繫結與動態繫結C++
- 深入理解 C++ 的動態繫結和靜態繫結C++
- Vue select 繫結動態變數Vue變數
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-繫結變數SQL變數
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數SQL變數
- 後期靜態繫結在PHP中的使用PHP
- oracle 繫結變數在動態條件統計中的應用Oracle變數
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-建立游標變數SQL變數
- 靜態變數和Session變數Session
- 關於pl/sql中的繫結變數SQL變數
- SQL server 動態SQL對變數講行賦值SQLServer變數賦值
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-開啟和關閉游標變數SQL變數
- 靜態變數與靜態方法變數
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數賦值SQL變數賦值
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為宿主變數SQL變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- js中的靜態變數JS變數
- 關於sql_profile中的繫結變數SQL變數
- 在Linux中建立靜態庫和動態庫Linux
- 靜態變數變數
- SQL Developer中使用繫結變數SQLDeveloper變數
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-偽列SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-語句SQL
- Java靜態變數在靜態方法內部無法改變值Java變數
- PLSQL Language Referenc-PL/SQL動態SQL-練習:在動態SQL塊中呼叫子程式。SQL
- 在hibernate中如何使用動態sqlSQL
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- mybatis動態sql總結MyBatisSQL
- 動態條件的繫結變數的解決變數
- SQLServer中動態查詢sql返回值給變數<整理>SQLServer變數
- Hive中靜態分割槽和動態分割槽總結Hive