用户取消程序ORA-01013时出现异常

Eos*_*rus 5 oracle plsql exception-handling oracle11g

我们有一个处理数据库中大量记录的过程.现在有时如果程序花费的时间过长,则用户手动取消该程序,从而抛出ORA-01013 EXCEPTION.但是,我们仍然想知道在取消程序之前处理了多少记录.我们尝试生成在EXCEPTION WHEN OTHERS块中调用的日志,但该块中的任何代码似乎都不起作用.我们甚至试图通过PRAGMA INIT EXCEPTIONORA-01013 提出一个例外而无济于事.代码似乎达到了异常但不执行任何代码.我猜测,由于该过程被取消,EXCEPTION块中的代码没有时间做任何事情而只是关闭.

知道如何获取在取消程序之前处理的记录的计数?我可以尝试在每次commit发生时增加记录但是想知道是否有更好的方法来实现这一点

Oll*_*lie 4

您可以在自主事务中记录进度。

即通过 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;
Run Code Online (Sandbox Code Playgroud)

如果该过程被取消,那么您可以查询 AT 记录的数据并查明已处理了多少行,因为日志表中的记录插入不会被您的“主”事务回滚。

另一种方法是使用UTL_FILE包写入日志文件,然后在事务取消时读取文件的内容。

顺便说一句,您可以将(几乎)任何您想要的代码放入异常部分,如果引发该异常,它将被执行。肯定还有其他原因导致您的代码未运行或被导致引发异常的事务回滚。

http://www.exforsys.com/tutorials/oracle-11g/oracle-11g-exception-handling.html

希望能帮助到你...