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は別途出力方法を考えないといけません。個人的に行き着いたのが以下方法です。