直接的な方法はありません。(別の回答で述べたように)ログを解析するか、代替方法を使用して、長時間実行プロセスで何が起こっているかを確認する必要があります。
個人的には、自律型トランザクションを使用してこの機能を有効にすることをお勧めします。トランザクション自体ではなく、何が起こっているかを知らせるロギングメカニズムとして。たとえば、PROCEDURE LONG_ACTIONでPROCEDURE WRITE_LOG_ENTRY(自律型トランザクションとして定義)を呼び出して、VARCHAR2を別のテーブルに書き込むことができます。自律型トランザクションは現在のトランザクションを妨害しません(論理的な観点から、パフォーマンスへの潜在的な影響に注意してください)。したがって、現在のトランザクションのCOMMITまたはROLLBACKに関係なく、ロギングエントリを介して何が起こっているかを確認できます。つまり、1つの大規模なDMLステートメントでそれを行うことができます。ループを使用する必要があります。
考慮してください:
TABLE LOG_ENTRIES defined as
activity_date date,
log_entry varchar2(2000)
TABLE BIG_JOB (definition doesn't really matter)
PROCEDURE WRITE_LOG_ENTRY
( str VARCHAR2 )
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO LOG_ENTRIES VALUES ( SYSDATE, str );
COMMIT;
END;
PROCEDURE LONG_ACTION IS
c NUMBER;
BEGIN
FOR r IN ( SELECT * FROM BIG_JOB )
LOOP
c := c + 1;
UPDATE BIG_JOB z
SET fld = hairy_calculation
WHERE z.rowid = r.rowid;
IF MOD(c,500) = 0 THEN
WRITE_LOG_ENTRY ( c || ' rows processed.' );
END IF;
END LOOP;
COMMIT;
END;
上記を考慮すると、長いアクションの成功に関係なく、処理された500行ごとにログエントリが取得されます。動作中にデータの正確な複製が必要な場合は、複製テーブルを作成し、データを複製するプロシージャを呼び出すことをお勧めします(プロシージャは自律型トランザクションです)。その後、データを事後的に破棄します。(複製の必要はありません。)
さらに、これがデバッグを目的とする場合は、テストを行ったときにそのようなロギングの必要性を削除するか、大幅に減らすことをお勧めします。そして、いつものように、自分のシステムでテスト、テスト、テストを行い、物事がどのように機能するかを検証します。(ロギングがパフォーマンスに大きく影響する良い例については、Niallのコメントを参照してください。)
(最後に、前に言及しなかったため:自律型トランザクションに注意してください。実装する前にそれらを完全に理解し、「理由だけで」使用しないでください。トリガーでのmutateエラーを回避するため、可能な場合は常に代替手段を見つけることが最善です。もしできない場合は、注意して続行してください。パフォーマンスの問題)、しかし、結果を知らずに急いで他の用途に適用しないでください。)