Oracle过程异常将停止其余过程

问题描述 投票:0回答:1

我想创建一个存储过程,在其中调用存储过程。如果其中之一失败,我想阻止它执行之后的任何过程。现在,如果第一个过程失败了,它仍在执行过程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;
oracle exception stored-procedures oracle-sqldeveloper procedure
1个回答
0
投票

根据您的评论:

[每个过程都说'然后别人例外'并插入错误信息放入日志表。所以当我运行上面的过程时,它说过程1失败,过程2和3已完成

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

更改此问题的两种最简单的方法是:

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

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

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

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


[顺便说一下,请与其他人一起照顾。从字面上看,这将捕获在Oracle中执行代码时可能发生的任何异常。数据损坏?异常被困。表不能扩展?异常被困。数据库正在关闭过程中?异常被困。其中一些异常可能意味着异常处理程序中的逻辑将无法执行。

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

© www.soinside.com 2019 - 2024. All rights reserved.