小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracleのv$sql_bind_captureで実行したSQLのバインド変数を調べる方法

はじめに

Oracleを使ったアプリケーションにおいて、ある操作によって実行されたSQLとそのとき渡されたバインド変数の値を調べたいときがあります。
ソースコードを見れば実行されるであろうSQLは推測することができますが、実際にどんな値がSQLに渡っているかまではわかりません。
そうした場合、v$sql_bind_captureビューを見ると、実行されたSQLに渡されたバインド変数の値を確認することができます。

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
小田 圭二 大塚 信男 五十嵐 建平 谷 敦雄 宮崎 博之 神田 達成 村方 仁
翔泳社
売り上げランキング: 113,432

v$sql_bind_captureからバインド変数の値を確認する

sysユーザで以下のクエリを実行すると、実行されたSQLのsql_idが取得できます。like句にはバインド変数を取得したいSQLを指定します。%を使うことで、前方一致や部分一致などで探すことができます。

connect sys/oracle as sysdba
-- select sql_id, sql_text from v$sql where sql_text like '実行されたSQL';
select sql_id, sql_text from v$sql where sql_text like 'select name, furigana, birthday from table01%';


SQLIDが分かったら、続いて以下のクエリでバインド変数を取得します。sql_idにはさきほど取得したsql_idを指定します。

--select name,value_STRING from v$sql_bind_capture where sql_id='上記クエリで取得したSQLID';
select name,value_STRING from v$sql_bind_capture where sql_id='aj4cwhhd985fw';


上記の例ではA1というバインド変数に、「やまだ%」という値が渡り、SQLが実行されたことを示しています。

v$sql_bind_captureの注意点

同じSQLIDで複数回SQLが実行されていた場合は必ずしも最後に実行されたときのバインド変数とは限らない。
正確にバインド変数の値を確認したい場合はトレースを仕込んでおく方がよい。
バインド変数の値を確認する - ぶりりあんとろーど(仮) はてなブックマーク - バインド変数の値を確認する - ぶりりあんとろーど(仮)

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