加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2021-03-06 01:05:30 所属栏目:百科 来源:网络整理
导读:我们有一个处理数据库中大量记录的过程.现在有时如果程序花费的时间过长,则用户手动取消该程序,从而抛出ORA-01013 EXCEPTION.但是,我们仍然想知道在取消程序之前处理了多少记录. 我们尝试生成一个在EXCEPTION WHEN OTHERS块中调用的日志,但该块中的任何代

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

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

解决方法

您可以在 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

希望能帮助到你…

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读