我们有一个过程可以处理数据库中的大量记录。现在有时如果该过程花费的时间太长,用户会手动取消该过程,从而引发 ORA-01013 异常。但是,我们仍然想知道在取消程序之前处理了多少记录。
我们尝试生成在 EXCEPTION WHEN OTHERS
中调用的日志块,但该块中的任何代码似乎都不起作用。我们甚至尝试通过 PRAGMA INIT EXCEPTION
提出异常对于 ORA-01013 无济于事。代码似乎达到了异常,但没有执行其中的任何代码。我猜是因为程序被取消了,EXCEPTION 块中的代码没有时间做任何事情,只是被关闭了。
知道如何在取消程序之前获得处理的记录计数吗?我可以尝试每次增加记录 commit
发生但想知道是否有更好的方法来实现这一目标
最佳答案
您可以在 autonomous transaction 中记录进度.
即通过 AT 将处理过的行记录到单独事务中的日志表中(具有自己的提交),例如:
CREATE OR REPLACE
PROCEDURE log_progress (
p_id IN NUMBER,
p_data IN VARCHAR2
)
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO log_table
(
id,
logging_data
)
VALUES
(
p_id,
p_data
);
--
COMMIT;
EXCEPTION
WHEN others
THEN
-- Log the error here
...
-- Re-raise if needed
RAISE;
END;
如果该过程被取消,那么您可以查询 AT 记录的数据并找出已处理的行数,因为您的“主”事务不会回滚日志表中的记录插入。
另一种方法是使用 UTL_FILE 写入日志文件。如果事务被取消,然后读取文件的内容。
顺便说一句,您可以将(几乎)任何您想要的代码放入异常部分,如果引发该异常,它将被执行。必须有另一个原因导致您的代码未运行或被导致引发异常的事务回滚。
http://www.exforsys.com/tutorials/oracle-11g/oracle-11g-exception-handling.html
希望能帮助到你...
关于oracle - 用户取消过程时处理异常 ORA-01013,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705572/