我想创建一个存储过程,在其中调用存储过程。如果其中之一失败,我想阻止它执行之后的任何过程。现在,如果第一个过程失败了,它仍在执行过程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;
根据您的评论:
[每个过程都说'然后别人例外'并插入错误信息放入日志表。所以当我运行上面的过程时,它说过程1失败,过程2和3已完成
这些异常处理程序不允许传播异常,并且调用过程无法知道被调用过程失败。
更改此问题的两种最简单的方法是:
((1)修改被调用过程中的异常处理程序以重新引发异常:
EXCEPTION
WHEN OTHERS THEN
/* Do the INSERT into log table */
RAISE;
然后,未处理的异常将导致调用过程转到其异常处理程序,该处理程序将执行ROLLBACK
。然后,该过程将结束。除非您还在其异常处理程序中添加RAISE
,否则调用过程仍然不会报告错误。
((2)将每个被调用的过程更改为一个返回成功或失败指示的函数。然后,您必须对调用过程进行重大更改,以检查每个函数的返回状态并决定如何继续。我不推荐这种方法。基本上是设计要避免的异常。
[顺便说一下,请与其他人一起照顾。从字面上看,这将捕获在Oracle中执行代码时可能发生的任何异常。数据损坏?异常被困。表不能扩展?异常被困。数据库正在关闭过程中?异常被困。其中一些异常可能意味着异常处理程序中的逻辑将无法执行。
使用其他人捕获所有异常进行日志记录可能会很有用,但是在这种情况下,我强烈建议您始终重新引发该异常,除非您知道可以从中恢复。