溫馨提示×

溫馨提示×

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

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

Oracle之綁定變量 2

發(fā)布時間:2020-06-05 19:51:26 來源:網(wǎng)絡(luò) 閱讀:588 作者:xiaofeng520ct 欄目:關(guān)系型數(shù)據(jù)庫

綁定變量(bind variable)我們經(jīng)常在寫plsql中用到,那我們承接上一節(jié)的來看看在plsql中靜態(tài)sql和動態(tài)sql在綁定變量的區(qū)別

declare
    v_value_a varchar2(100);
    v_value_b varchar2(100);
    v_name  varchar2(50);
begin
    v_value_a := 'SMITH';
    select e.ename/*+test*/into v_name from scott.emp e where e.ename = v_value_a;
    v_value_b := 'ALLEN';
    select e.ename/*+test*/into v_name from scott.emp e where e.ename = v_value_b;
end;
/

查詢v$sql

select * from v$sql d where d.SQL_TEXT like '%/*+test*/%';

Oracle之綁定變量 2

這里看到只產(chǎn)生了一條sql_id,oracle會自動把變量v_value_a,v_value_b換成綁定變量:B1.


再來看看動態(tài)sql

PLSQL_1:
declare
    v_value_a varchar2(100);
    v_value_b varchar2(100);
    v_name  varchar2(50);
begin
    v_value_a := 'SMITH';
    
    v_value_b := 'ALLEN';

    execute immediate 'select e.ename/*+sql*/ from scott.emp e where e.ename = :xxx' 
    using v_value_a;
    
    execute immediate 'select e.ename/*+sql*/ from scott.emp e where e.ename = :yyy' 
    using v_value_b;
end;
/

查詢v$sql

select * from v$sql d where d.SQL_TEXT like '%/*+sql*/%';

Oracle之綁定變量 2

這里可以看到動態(tài)sql就是以執(zhí)行sql為文本進(jìn)行解析的,如果兩個sql有不同就是不同的sql語句。


2.獲取綁定變量的值

那我們可以得到綁定的變量的值嗎?通過v$sql_bind_capture就可以查詢到

SQL_1:
select d.NAME, d.POSITION, d.SQL_ID, value_string
  from v$sql_bind_capture d
 where d.SQL_ID in
       (select sql_id from v$sql v where v.SQL_TEXT like '%/*+sql*/%')

Oracle之綁定變量 2

這時我們看到綁定變量的值是上文看到的v_value_a和v_value_b的值。

接著往下走,改變v_value_a的值:

v_value_a := 'CLARK';

執(zhí)行PLSQL_1,SQL_1

Oracle之綁定變量 2

綁定變量的值并沒有發(fā)生變化,這時為什么呢?

  • v$sql_bind_capture這個視圖是一個快照視圖,并不會保存所有執(zhí)行過的SQL的綁定變量,只會記錄最近一次捕獲到的綁定值,而已每次捕獲都是有間隔時間的。ORACLE為我們提供了一個隱含參數(shù)_cursor_bind_capture_interval(默認(rèn)900s),這個就是控制綁定變量抓取頻率的參數(shù)。

  • 如果綁定變量是DATE類型則無法直接查看到的。


向AI問一下細(xì)節(jié)

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

AI