oracleセッション情報

Oracle 現在実行中のSQL一覧

V$SESSIONをSTATUS=’ACTIVE’の条件で検索する事で現在実行中SQL_IDを取得できます。これをV$SQLと結合する事で実際のSQL_TEXTを取得できます。

以下はRAC環境を意識してGV$を利用していますが、シングル環境においてもそのまま使えます。
「ORA-00942: 表またはビューが存在しません」とエラーが出てしまった方は、DBAの方に「SELECT_CATALOG_ROLEの権限付与をお願いします」と依頼しましょう。

実行中SQL一覧
select 
  a.INST_ID
 ,a.SCHEMANAME
 ,a.SQL_ID
 ,a.SQL_CHILD_NUMBER
 ,a.WAIT_CLASS
 ,a.EVENT
 ,a.BLOCKING_SESSION_STATUS
 ,SQL_EXEC_START
 ,trunc((sysdate - a.SQL_EXEC_START) * 24 * 60 * 60,2) as "秒" --動作し続けている時間
 ,a.MODULE
 ,substr(b.SQL_TEXT,1, 128) as sql_head
from 
GV$SESSION a,
GV$SQL b
where 1 = 1
and status = 'ACTIVE'
and a.INST_ID = b.INST_ID
and a.SQL_ID = b.SQL_ID
and a.SQL_CHILD_NUMBER = b.CHILD_NUMBER
order by a.INST_ID,a.SQL_EXEC_START 
;

実行しているSQLが比較的小さいものであれば上記のようにSQL_TESTでよいのですが、VARCHAR2の最大サイズを超えてしまうような大きなSQLや改行が含まれるようなSQLは別途出力方法を考えないといけません。個人的に行き着いたのが以下方法です。

SQL_IDからSQL_FULLTEXTを出力する

ストアドプロシージャの作成に抵抗がある方はこちら

スポンサーリンク