【问题标题】:Oracle procedure exception that stops rest of procedures停止其余过程的 Oracle 过程异常
【发布时间】:2020-08-21 18:40:47
【问题描述】:

我想创建一个在其中调用存储过程的存储过程。 如果其中一个失败,我想阻止它执行任何后续的过程。现在,如果第一个过程失败,它仍然在执行过程 2 和 3。我怎样才能让它停止这样做?

create or replace PROCEDURE run_three_procedures AS 
BEGIN
Package.procedure1;
Package.procedure2;
Package.procedure3;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;

END run_three_procedures;

【问题讨论】:

  • 您描述的当前行为不正常。如果procedure1 抛出异常,那应该会导致整个过程立即结束。各个过程是否有阻止异常传播给调用者的 EXCEPTION 子句?
  • @davecosta 每个过程都说“当其他人出现异常”并将错误信息插入日志表中。所以当我运行上面的过程时,它说过程 1 失败,过程 2 和 3 完成

标签: oracle exception stored-procedures oracle-sqldeveloper procedure


【解决方案1】:

根据您的评论:

每个程序都说“其他程序时异常”并插入错误 信息到日志表中。所以当我运行上面的程序时,它说 程序 1 失败,程序 2 和 3 完成

这些异常处理程序不允许异常传播,调用过程无法知道被调用过程失败。

改变这种情况的两种最简单的方法是:

(1)修改被调用过程中的异常处理函数,重新引发异常:

EXCEPTION
  WHEN OTHERS THEN
     /* Do the INSERT into log table */
     RAISE;

然后,未处理的异常将导致调用过程转到其异常处理程序,该处理程序将执行ROLLBACK。然后程序将结束。调用过程仍然不会报告错误,除非您还在其异常处理程序中添加RAISE

(2) 将每个被调用的过程更改为返回一些成功或失败指示符的函数。然后,您必须对调用过程进行重大更改,以检查每个函数的返回状态并决定如何进行。我不推荐这种方法;这基本上是旨在避免的异常。


顺便说一句,当别人时要小心。这将捕获在 Oracle 中执行代码时可能发生的任何异常。数据损坏?异常被困。表不能扩展?异常被困。数据库在关闭过程中?异常被困。其中一些异常可能意味着您的异常处理程序中的逻辑将无法执行。

使用 WHEN OTHERS 捕获所有异常以进行日志记录可能很有用,但在这种情况下,我强烈建议始终重新引发异常,除非您知道可以从中恢复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2010-11-10
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多