oracle

Oracle SQL_IDの取得方法

実行した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>

スポンサーリンク