查詢繫結變數的值

eric_zhyd發表於2013-06-05
有好長一段時間沒有發表過任何文章,主要是近期工作都沒有做與ORACLE相關的事宜。今天正好有一些時間,記錄一個技巧性的SQL語句。

我們通常在想找一個SQL中包含的繫結變數值時,10046是條件反射的一個操作。不過有的時候,我們希望知道一個已經存在的硬解析到底運用了什麼繫結變數進行執行計劃生成。可能就需要以下的命令進行查詢:

ZHONG@ zhongpdb SQL>var p1 number;
ZHONG@ zhongpdb SQL>begin
  2  :p1 := 2300;
  3  end;
  4  /

PL/SQL 過程已成功完成。

ZHONG@ zhongpdb SQL>select count(*) from t1 where object_id > :p1 ;

  COUNT(*)
----------
     68839

ZHONG@ zhongpdb SQL>col sql_text format a80
ZHONG@ zhongpdb SQL>SELECT sql_id, child_number , sql_text FROM v$sql WHERE  LOWER(sql_text) LIKE '&SQLTEXT';
輸入 sqltext 的值:  select count(*) from t1%
原值    1: SELECT sql_id, child_number , sql_text FROM v$sql WHERE  LOWER(sql_text) LIKE '&SQLTEXT'
新值    1: SELECT sql_id, child_number , sql_text FROM v$sql WHERE  LOWER(sql_text) LIKE 'select count(*) from t1%'

SQL_ID        CHILD_NUMBER SQL_TEXT
------------- ------------ --------------------------------------------------------------------------------
2zbp0v9dgsrru            0 select count(*) from t1 where object_id > :p1

ZHONG@ zhongpdb SQL>SELECT name
  2    ,      position
  3    ,      datatype_string
  4    ,      was_captured
  5    ,      value_string
  6  FROM   v$sql_bind_capture
  7  WHERE  sql_id = '&SQLID';
輸入 sqlid 的值:  2zbp0v9dgsrru
原值    7: WHERE  sql_id = '&SQLID'
新值    7: WHERE  sql_id = '2zbp0v9dgsrru'

NAME                                                           POSITION DATATYPE_STRING                WAS
------------------------------------------------------------ ---------- ------------------------------ ---
VALUE_STRING
-------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------
:P1                                                                   1 NUMBER                         YES
2300


此方法只能對第一次硬解析時有效,軟解析無法截獲變數資訊!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12974804/viewspace-763141/,如需轉載,請註明出處,否則將追究法律責任。

相關文章