oracle - 停止其余过程的 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;
解决方案
根据您的评论:
每个过程都说“其他人时例外”并将错误信息插入日志表。所以当我运行上面的程序时,它说程序 1 失败,程序 2 和 3 完成
这些异常处理程序不允许异常传播,调用过程无法知道被调用过程失败。
改变这种情况的两种最简单的方法是:
(1) 修改被调用过程中的异常处理函数,重新引发异常:
EXCEPTION
WHEN OTHERS THEN
/* Do the INSERT into log table */
RAISE;
然后,未处理的异常将导致调用过程转到其异常处理程序,该处理程序将执行ROLLBACK
. 然后程序将结束。调用过程仍然不会报告错误,除非您还添加RAISE
了它的异常处理程序。
(2) 将每个被调用的过程更改为返回一些成功或失败指示符的函数。然后,您必须对调用过程进行重大更改,以检查每个函数的返回状态并决定如何进行。我不推荐这种方法;这基本上是旨在避免的异常。
顺便说一句,当别人时要小心。这将捕获在 Oracle 中执行代码时可能发生的任何异常。数据损坏?异常被困。表不能扩展?异常被困。数据库在关闭过程中?异常被困。其中一些异常可能意味着您的异常处理程序中的逻辑将无法执行。
使用 WHEN OTHERS 捕获所有异常以进行日志记录可能很有用,但在这种情况下,我强烈建议始终重新引发异常,除非您知道可以从中恢复。
推荐阅读
- angular - ag-grid 正在添加带有列定义的硬编码 _1
- ansible - 将两个版本号与 ansible 中的版本进行比较
- woocommerce - 为 /orders 端点扩展 Woocommerce Rest API 类和更改架构
- javascript - Discord.js - 我正在尝试创建一个不和谐机器人,它将语音通道中的所有连接成员静音
- c++ - 使用 ffmpeg 将 PCM-ALAW 数据转换为音频文件
- docker - Gitlab CI/CD 中的 Puppeteer,在 Headfull 浏览器中测试不起作用
- xamarin.forms - 从表单到 iOS 的导航服务
- java - Java Swing:通过鼠标点击 JPanel 制作一个不断增长的圆圈
- woocommerce - Woocommerce:如果客户已经购买了此产品,则隐藏添加到购物车按钮
- swift - 你如何在 UIKit 视图控制器和它呈现的 SwiftUI 视图之间共享数据模型?