Oracle之綁定變數 2

來源:互聯網
上載者:User

標籤:plsql

綁定變數(bind variable)我們經常在寫plsql中用到,那我們承接上一節的來看看在plsql中靜態sql和動態sql在綁定變數的區別

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*/%‘;

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/87/30/wKiom1fWwtfzvdAuAABUe2R8PL4069.png-wh_500x0-wm_3-wmp_4-s_212433948.png" title="QQ20160912225920.png" alt="wKiom1fWwtfzvdAuAABUe2R8PL4069.png-wh_50" />

這裡看到只產生了一條sql_id,oracle會自動把變數v_value_a,v_value_b換成綁定變數:B1.


再來看看動態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*/%‘;

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/87/30/wKiom1fWxH_RXDQdAACPRV8qgI0965.png-wh_500x0-wm_3-wmp_4-s_1077068967.png" title="QQ20160912225920.png" alt="wKiom1fWxH_RXDQdAACPRV8qgI0965.png-wh_50" />

這裡可以看到動態sql就是以執行sql為文本進行解析的,如果兩個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*/%‘)

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/87/D2/wKioL1fidubQRzHdAAB3vUyhBUs165.png-wh_500x0-wm_3-wmp_4-s_898096665.png" title="QQ20160921200158.png" alt="wKioL1fidubQRzHdAAB3vUyhBUs165.png-wh_50" />

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

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

v_value_a := ‘CLARK‘;

執行PLSQL_1,SQL_1

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/87/D2/wKioL1fieRnyhxdeAAB00-JZ78c283.png-wh_500x0-wm_3-wmp_4-s_192305743.png" title="QQ20160921201159.png" alt="wKioL1fieRnyhxdeAAB00-JZ78c283.png-wh_50" />

綁定變數的值並沒有發生變化,這時為什麼呢?

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

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


本文出自 “11768293” 部落格,請務必保留此出處http://11778293.blog.51cto.com/11768293/1855156

Oracle之綁定變數 2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.