oracle - 用户取消过程时处理异常 ORA-01013

标签 oracle exception-handling plsql oracle11g

我们有一个过程可以处理数据库中的大量记录。现在有时如果该过程花费的时间太长,用户会手动取消该过程,从而引发 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/

相关文章:

java - 从 Oracle PLSQL 调用 java 时如何将参数传递给 java

plsql - 外部命令,将外部变量返回给 Oracle Apex?

sql - 在 Oracle 中删除大量数据

oracle - 在PL SQL游标中查询DBA_TABLES和USER_TABLES

.net - Oracle.DataAccess.Client 错误

sql - 如何在 Oracle 中使用内部联接进行更新

java - 是否可以在数据库中安装 Java 编译器?

react-native - React Native - 在调用 multiSet 时抛出异常 '-[NSNull length]: unrecognized selector sent to instance 0x1e6c059b0'

python - 在 Python 中处理未声明的 dict 键

c# - 创建我自己的异常 c#