没有直接的方法。您将不得不解析日志(如另一个答案中所述),或使用其他方法来查看长时间运行的过程中发生的情况。
就个人而言,我建议使用自主事务来启用此功能-不在事务本身上,而是作为一种日志记录机制,让您知道正在发生的事情。例如,您可能具有PROCEDURE LONG_ACTION调用PROCEDURE WRITE_LOG_ENTRY(定义为自主事务),该调用会将VARCHAR2写入另一个表。自主事务不会干扰您的当前事务(从逻辑的角度;要注意对性能的潜在影响),因此无论当前事务中的COMMIT还是ROLLBACK,您都可以通过日志记录条目查看正在发生的情况。就是说,您可以使用一个庞大的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的评论。)
(最后,因为我之前没有提到它:当心自主事务。在实施之前要充分理解它们,不要“仅仅因为”使用它们。它们有百万种用法不正确(例如,对于ATTEMPT,避免在触发器中发生变异错误),因此,如果可能的话,最好总是找到替代方法。如果不能,则请谨慎行事。长期运行ops期间的日志记录一直是相当安全的一种情况(忽略性能问题),但不要在不知道后果的情况下急于将其应用于其他用途。)