実行されたSQLの履歴で1000文字を超えるログを確認する
Oracleで実行されたSQLの履歴を確認する際、長い(1000文字を超える)SQLの確認方法が検索してもすぐに見つからなかったので、メモしておきます。
検索したらすぐ出てくるものと思ったら、なかなか出てきませんでした。
目次
- コード
- 1000文字を超えるSQLを確認するコード
- バインドされた値の確認
- 最後に
コード
通常、Oracleで実行されたSQLの履歴を確認する方法で検索すると、以下の記事がヒットします。
Oracleで実行されたSQLの履歴を確認する - Qiita
こちらで示されている確認するためのSQLは以下の通り(記事より抜粋)。
select last_active_time,parsing_schema_name,sql_text from v$sqlarea
where parsing_schema_name <> 'SYS'
and parsing_schema_name <> 'SYSMAN'
and parsing_schema_name <> 'DBSNMP'
and parsing_schema_name <> 'MDSYS'
and parsing_schema_name <> 'EXFSYS'
order by last_active_time desc;
最初は上記のSQLで履歴を確認できるものと思っていましたが、実際にやってみると、確認できるSQLは1000文字以内で、私が確認したかったSQLは1000文字を優に超えるSQLだったので、途方に暮れてしまいました。
ぶっちゃけ、一度は諦めましたが、もう一度調べる機会があって、その時に1000文字を超えるSQLの内容を確認する方法が分かりました。
1000文字を超えるSQLを確認するコード
1000文字を超えるSQLを確認するコードは以下の通り。
select last_active_time,parsing_schema_name,sql_fulltext from v$sqlarea
where parsing_schema_name <> 'SYS'
and parsing_schema_name <> 'SYSMAN'
and parsing_schema_name <> 'DBSNMP'
and parsing_schema_name <> 'MDSYS'
and parsing_schema_name <> 'EXFSYS'
order by last_active_time desc;
パッと見は違いが分かり難いと思いますが、SELECTしている「sql_text」が「sql_fulltext」に変わっています。
詳しくはこちらを参照。
同じビュー内に全文のSQLを表示するためのカラムが用意されていたのに、確認するまでは分かりませんでした。
普通は1000文字を超えるSQLなんて作ったりしないんですかね。私が関わっているプロジェクトでは、ザラにあったりますけど。
バインドされた値の確認
実行されたSQLの履歴は上記のSQLで確認できるようになりましたが、アプリケーションからSQKが実行された場合、バインドされた値を確認したい時があると思います。
そういった時、「v$sqlarea」でもそれっぽいカラム(BIND_DATA)は用意されているのですが、型がRAWで格納されている値の変換が必要だったりして、簡単に確認することはできませんでした。
他にないものかと調べて見つけたのが「V$SQL_BIND_CAPTURE」というビューです。
カラム「SQL_ID」を使って上述の「v$sqlarea」と連結することによって、実際にバインドされた値が分かると思います。
最後に
一旦は諦めましたが、必要なものはちゃんと用意されているんですね。
さすがは「Oracle」といったところでしょうか。