2019.9.25
2020.1.7

実行された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」というビューです。

V$SQL_BIND_CAPTURE

カラム「SQL_ID」を使って上述の「v$sqlarea」と連結することによって、実際にバインドされた値が分かると思います。

最後に

一旦は諦めましたが、必要なものはちゃんと用意されているんですね。

さすがは「Oracle」といったところでしょうか。

Oracle】関連記事