繫結變數在靜態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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 介面的繫結方案和動態SQLSQL
- C++的動態繫結和靜態繫結C++
- java中的靜態繫結與動態繫結Java
- 理解靜態繫結與動態繫結
- Vue select 繫結動態變數Vue變數
- 後期靜態繫結在PHP中的使用PHP
- mybatis動態sql總結MyBatisSQL
- 後期靜態繫結
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- 靜態變數變數
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- 延遲靜態繫結——static
- php 後期靜態繫結PHP
- Hive中靜態分割槽和動態分割槽總結Hive
- MyBatis 動態 SQLMyBatisSQL
- MybBatis動態SQLBATSQL
- Mybatics動態sqlBATSQL
- mybatis動態SQLMyBatisSQL
- BIRT 中如何根據引數動態拼接 SQLSQL
- 動態 SQL 和快取機制SQL快取
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 【MyBatis學習總結 (五),動態SQL】MyBatisSQL
- 偽靜態、靜態和動態的區別
- MyBatis(七) 動態SQLMyBatisSQL
- 1 Mybatis動態SQLMyBatisSQL
- Mybatis--動態SQLMyBatisSQL
- Java中的靜態代理和動態代理Java
- 靜態路由和動態路由路由
- 靜態代理和動態代理
- class 和 style 資料動態繫結
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- V$sql查詢未使用繫結變數的語句SQL變數
- PB帶引數帶結果集的動態SQL查詢SQL
- Mybatis-06 動態SqlMyBatisSQL
- ios靜態庫和動態庫iOS
- 對 PHP 後期靜態繫結的理解PHP