Oracle之綁定變量 2

綁定變量(bind variable)咱們常常在寫plsql中用到,那咱們承接上一節的來看看在plsql中靜態sql和動態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$sqloracle

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

wKiom1fWwtfzvdAuAABUe2R8PL4069.png-wh_50

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


再來看看動態sqlspa

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$sqlorm

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

wKiom1fWxH_RXDQdAACPRV8qgI0965.png-wh_50

這裏能夠看到動態sql就是以執行sql爲文本進行解析的,若是兩個sql有不一樣就是不一樣的sql語句。blog


2.獲取綁定變量的值get

那咱們能夠獲得綁定的變量的值嗎?經過v$sql_bind_capture就能夠查詢到string

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*/%')

wKioL1fidubQRzHdAAB3vUyhBUs165.png-wh_50

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

接着往下走,改變v_value_a的值:io

v_value_a := 'CLARK';

執行PLSQL_1,SQL_1

wKioL1fieRnyhxdeAAB00-JZ78c283.png-wh_50

綁定變量的值並無發生變化,這時爲何呢?

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

  • 若是綁定變量是DATE類型則沒法直接查看到的。

相關文章
相關標籤/搜索