溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用ORACLE中的綁定變量

發(fā)布時間:2021-11-08 14:23:49 來源:億速云 閱讀:1947 作者:iii 欄目:關系型數(shù)據(jù)庫

這篇文章主要講解了“怎么使用ORACLE中的綁定變量”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么使用ORACLE中的綁定變量”吧!

一、綁定變量的作用

:variable_name(字母,數(shù)字,或者字母數(shù)字組合)

有效降低硬解析

二、綁定變量的典型用法

sql中

var x number;

exec :x :=7876;

select * from emp where empno = :x;

pl/sql中,例如

declare

  vc_name varchar2(10);

 begin

    execute immediate 'select ename from emp where empno= :1' into vc_name using 7876;

    dbms_output.put_line(vc_name);

 end;

所以在pl/sql中綁定變量的標準語法為:

execute immediate 【使用綁定變量的語句】  using 對應綁定變量的具體輸入值;

PL/SQL中DML語句的綁定變量典型用法

declare

 v_sql1  varchar2(50);

 v_sql2  varchar2(50);

 v_num1  number;

 v_num2  number;

begin

  v_sql1 := 'insert into emp(empno,ename,sal) values(:1,:1,:1)';

  execute immediate v_sql1 using 8001,'jack',1000;

  v_num1 :=sql%rowcount;  --sql%rowcount中的sql是oracle的內部游標,rowcount的意思是之前的dml sql語句影響的多少行數(shù)據(jù)

  execute immediate v_sql1 using 8002,'mike',2000;

  v_num2 :=sql%rowcount;

  dbms_output.put_line(v_num1+v_num2);

  end;

動態(tài)sql中也可以使用綁定變量,returning 這個關鍵字可以和帶綁定變量的SQL聯(lián)用,其作用是將受該SQL影響的行記錄字段取出來。

三、pl/sql中批量綁定的典型用法

批量綁定:一次性處理一批數(shù)據(jù)

pl/sql引擎是指在Oracle在數(shù)據(jù)庫中處理pl/sql代碼中除了SQL語句外所有剩余部分(如變量,循環(huán),數(shù)組,賦值)的子系統(tǒng)

批量綁定可以有效減少SQL引擎和pl/sql引擎的交互次數(shù)

理論上來說,pl/sql中只要執(zhí)行SQL語句,就會有這兩個引擎的交互,實際上這兩個引擎交互產(chǎn)生的性能影響主要體現(xiàn)在以下兩個方面

1、當顯式游標或者參考游標需要循環(huán)執(zhí)行fetch操作時,這時循環(huán)由pl/sql執(zhí)行,fetch中的SQL由SQL引擎執(zhí)行,這樣每fetch一條記錄,就需要兩個引擎交互一次

2、當顯式游標或者參考游標的循環(huán)內部需要執(zhí)行SQL語句,跟上面一樣,也是每執(zhí)行一次,需要交互一次

所以當fetch一批記錄,或者一次執(zhí)行一批SQL,就會大大提高pl/sql的效率

批量fetch對應的語法

fetch cursorname bulk colletc into 【自定義的數(shù)組】 <limit cn_batch_size>

pl/sql中批量執(zhí)行一批SQL的語法

forall i in 1..[自定義數(shù)組長度】

  execute immediate [帶綁定變量的sql] using [綁定變量輸入值】

declare

  cur_emp sys_refcursor;

  v_sql varchar2(4000);

  type namelist is table of varchar2(10);

  enames namelist;

  cn_batch_size constant pls_integer :=1000;

begin

  v_sql:= 'select ename from emp where empno> :1';

  open cur_emp for v_sql using 7900;

  loop

    fetch cur_emp bulk collect into enames limit cn_batch_size;

    for i in 1..enames.count loop

      dbms_output.put_line(enames(i));

      end loop;

    exit when enames.count<cn_batch_size;

    end loop;

    close cur_emp;

    end;

四、綁定變量分級(bind graduation)

根據(jù)文本型綁定變量的定義長度而將這些綁定變量分成四級

1、32字節(jié)(bytes)以內第一級 分配32字節(jié)

2、33--128字節(jié)第二級   分配120字節(jié)

3、129--2000字節(jié)第三級 分配2000字節(jié)

4、2000字節(jié)以上第四級 ,按實際綁定變量大小,小于等于2000則分配2000字節(jié),大于2000則分配4000字節(jié)

注意 oracle只對文本型綁定變量分級,數(shù)值型的統(tǒng)一分配22字節(jié),另外一個重要知識點,在pl/sql中,要是文本綁定變量的定義長度發(fā)生了變化,因為child cursor 里存儲了該綁定變量的長度和類型,所以這個sql就會新做硬解析。因此,為了避免不必要的硬解析,在pl/sql中,定義文本綁定變量是,最好統(tǒng)一定義長度,比如varchar2(4000);

五、目標sql中的綁定變量不宜過多

六、如何得到已執(zhí)行sql中綁定變量的值

V$SQL_BIND_CAPTURE,如果已經(jīng)被aged out 除shared pool,則可以看另外兩張dba_hist_sqlstat,dba_hist_sqlbind

滿足下列條件之一,含有綁定變量的目標sql中的綁定變量值會被捕獲,然后可以從v$sql_bind_capture中查詢到

1、該sql做的是硬解析

2、該SQL做的是軟解析或軟軟解析,這是每隔15分鐘,捕獲一次值

注意對綁定變量值的捕獲只在where 語句中的綁定變量,其他比如insert中的值不會被捕獲

感謝各位的閱讀,以上就是“怎么使用ORACLE中的綁定變量”的內容了,經(jīng)過本文的學習后,相信大家對怎么使用ORACLE中的綁定變量這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI