実行したSQLのSQL_IDが知りたいシーンってよくありますよね。おそらくほとんどの人は「SQLテキストの中にコメントとしてキーワードを埋め込んだ状態で実行しV$SQLを検索」する方法ではないでしょうか。けっこう泥臭いですよね。今回はこれ以外の方法で取得できる方法を2つ紹介します。
18c以降のバージョン限定
18c以降のバージョンでかつSQL*PlusおよびSQLcl限定とはなりますが、SQL実行前にset でシステム変数を設定する事で出力されるようになります。一つ注意点あります。SQL*PlusでSQL実効する場合セミコロン「;」のつける位置によって変化します。最後の改行(SQLclの場合は変化ありません)
set feedback on sql_id
SQL> set feedback on sql_id
SQL> select '前回動作したSQL' from dual; ←同一行に入れた場合
'前回動作したSQL'
------------------------------------------
前回動作したSQL
1行が選択されました。
SQL_ID: ghr4mqknzhf70
SQL>
SQL> select '前回動作したSQL' from dual
2 ; ←次の行に入れた場合
'前回動作したSQL'
------------------------------------------
前回動作したSQL
1行が選択されました。
SQL_ID: 2ckkq6f17hdmq
SQL>
バージョン問わず可能なお手軽な方法
こちらも SQL*PlusおよびSQLcl限定 になりますが、こんな方法もあります。v$sessionのprev_sqlは「そのセッションで最後に実行されたSQL_ID」が設定されています。これを使う事で取得できます。
条件として正常に終了したSQLでないと「前回実行したSQL」として認められません。大量件数を取得するようなSELECTにおいて途中で停止してしまうと(全てfetchしないとだめです)前回実行SQLとされないので注意です。
select prev_sql_id from v$session where sid = sys_context('USERENV','SID') ;
SQL> select '前回動作したSQL' from dual;
'前回動作したSQL'
------------------------------------------
前回動作したSQL
SQL> select prev_sql_id from v$session where sid = sys_context('USERENV','SID');
PREV_SQL_ID
--------------------------
ghr4mqknzhf70
SQL>