ablog

不器用で落着きのない技術者のメモ

v$sql_bind_capture でバインド変数の値を見る

バインド変数の値を見る - ablog のつづき。
v$sql_bind_capture でバインド変数の値を確認してみた。
SQL*Plus でバインド変数を使ったSQLを発行して、

$ sqlplus scott/tiger
SQL> variable v1 char(3);
SQL> exec :v1 := '001';

PL/SQL procedure successfully completed.

SQL> select * from emp where id =:v1

ID     NAME
------ --------------------
001    scott

SQL> select userenv('SESSIONID') from dual;

USERENV('SESSIONID')
--------------------
              284070

v$sql_bind_capture で確認してみると、

$ sqlplus / as sysdba
SQL> col sql_text for a70
SQL> select sid, sql_hash_value, sql_address, sql_text 
 from v$session a, v$sqltext b  
 where a.sql_address = b.address and a.sql_hash_value = b.hash_value;

       SID SQL_HASH_VALUE SQL_ADDR SQL_TEXT
---------- -------------- -------- ----------------------------------------------------------------------
       191     3778805849 5CD961F4 select * from emp where id =:v1
       194     4125990864 5CD97BC4 value = b.hash_value
       194     4125990864 5CD97BC4  a, v$sqltext b  where a.sql_address = b.address and a.sql_hash_
       194     4125990864 5CD97BC4 select sid, sql_hash_value, sql_address, sql_text from v$session
       196     4281219134 5CFB8C80 BEGIN EMD_NOTIFICATION.QUEUE_READY(:1, :2, :3); END;

SQL> col name for a10
SQL> col value_string for a10
SQL> select address, hash_value, name, value_string 
 from v$sql_bind_capture
 where address = '5CD961F4'
 and hash_value = 3778805849;

ADDRESS  HASH_VALUE NAME       VALUE_STRI
-------- ---------- ---------- ----------
5CD961F4 3778805849 :V1        001

バインド変数の値が見れた。
ただ、この方法だと、

v$sql_bind_capture may not give you the right bind variable value as you can't really control when exactly the capture happens (you may see an "old" bind value or someone else's bind there).

RE: Tx - row lock contention after implementing transaction management in application server - oracle-l - FreeLists

ということで、本当に見たいバインド変数の値を見れているのかどうかわからない。バインド変数を使ったSQLは共有されるので、古い値を見ていたり、別のセッションでセットされた値を見ていたりする可能性がある。


[参考]
RE: Tx - row lock contention after implementing transaction management in application server - oracle-l - FreeLists
http://taaboo.at.webry.info/200604/article_1.html
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-03/dynviews_2.htm#132759