首页 > 解决方案 > 停止其余过程的 Oracle 过程异常

问题描述

我想创建一个在其中调用存储过程的存储过程。如果其中一个失败,我想阻止它执行任何后续的过程。现在,如果第一个过程失败,它仍然在执行过程 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;

标签: oracleexceptionstored-proceduresoracle-sqldeveloperprocedure

解决方案


根据您的评论:

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

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

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

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

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

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

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


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

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


推荐阅读