Oracle中自定义异常内置异常嵌套异常的捕获处理

news2025/5/11 1:31:21

一、异常类型分类

类型说明示例
内置预定义异常Oracle已命名异常(如NO_DATA_FOUND)查询无数据时触发
内置非预定义异常未命名的Oracle错误(需用PRAGMA EXCEPTION_INIT关联)ORA-02290(违反检查约束)
自定义异常用户定义的业务逻辑异常数据校验失败时手动抛出

二、异常处理语法
1. 基本结构

DECLARE
  -- 声明自定义异常
  custom_exception EXCEPTION;
  -- 绑定错误代码到非预定义异常
  PRAGMA EXCEPTION_INIT(custom_exception, -20001);
BEGIN
  -- 业务逻辑
  IF 条件 THEN
    RAISE custom_exception; -- 手动抛出异常
  END IF;
EXCEPTION
  WHEN custom_exception THEN
    DBMS_OUTPUT.PUT_LINE('自定义异常触发');
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('数据未找到');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('错误代码: ' || SQLCODE);
    DBMS_OUTPUT.PUT_LINE('错误信息: ' || SQLERRM);
END;

三、异常语法
1. 自定义异常
步骤说明:

①声明异常:

DECLARE
  invalid_salary EXCEPTION;

②关联错误代码(可选):

PRAGMA EXCEPTION_INIT(invalid_salary, -20001);

③抛出异常:

IF salary < 0 THEN
  RAISE invalid_salary;
END IF;

④捕获处理:

EXCEPTION
  WHEN invalid_salary THEN
    DBMS_OUTPUT.PUT_LINE('薪资不能为负数');

2. 内置异常处理
常用预定义异常:
NO_DATA_FOUND: SELECT未找到数据
TOO_MANY_ROWS: SELECT返回多行数据
ZERO_DIVIDE: 除数为零
DUP_VAL_ON_INDEX: 唯一索引冲突

-- 示例:
BEGIN
  SELECT * INTO emp_rec FROM emp WHERE emp_id = 999;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('员工ID不存在');
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('返回多行数据');
END;

3. 嵌套异常处理
结构示例:

DECLARE
  outer_exception EXCEPTION;
BEGIN
  <<inner_block>>
  DECLARE
    inner_exception EXCEPTION;
  BEGIN
    RAISE inner_exception;
  EXCEPTION
    WHEN inner_exception THEN
      DBMS_OUTPUT.PUT_LINE('内部异常已处理');
      RAISE outer_exception; -- 抛出到外层
  END inner_block;
EXCEPTION
  WHEN outer_exception THEN
    DBMS_OUTPUT.PUT_LINE('外部捕获到异常');
END;

详细实例:

DECLARE
  -- 定义变量和异常
  v_employee_id employees.employee_id%TYPE := 100;
  v_salary employees.salary%TYPE;
  e_negative_salary EXCEPTION; -- 自定义异常:工资为负
  PRAGMA EXCEPTION_INIT(e_negative_salary, -20001); -- 绑定错误代码
BEGIN
  -- 外层块
  BEGIN -- 内层块开始
    -- 尝试获取员工工资
    SELECT salary INTO v_salary 
    FROM employees 
    WHERE employee_id = v_employee_id;

    -- 模拟业务逻辑:检查工资有效性
    IF v_salary < 0 THEN
      RAISE_APPLICATION_ERROR(-20001, '工资不能为负数'); -- 触发自定义异常
    END IF;

    DBMS_OUTPUT.PUT_LINE('内层块:工资处理成功。');

  EXCEPTION -- 内层异常处理
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('内层块:员工ID ' || v_employee_id || ' 不存在。');
      RAISE; -- 重新抛出到外层
    WHEN e_negative_salary THEN
      DBMS_OUTPUT.PUT_LINE('内层块:异常 - ' || SQLERRM);
      -- 此处可添加恢复逻辑,如设置默认工资
      v_salary := 0;
      DBMS_OUTPUT.PUT_LINE('内层块:工资已重置为0。');
  END; -- 内层块结束

  -- 外层业务逻辑(内层未异常终止时执行)
  DBMS_OUTPUT.PUT_LINE('外层块:更新后工资为 ' || v_salary);

EXCEPTION -- 外层异常处理
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('外层块:错误 - 指定员工不存在。');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('外层块:未知错误 - ' || SQLERRM);
    ROLLBACK; -- 示例事务回滚
END;

嵌套结构:

  • 内层块: 处理具体数据库操作(如查询、业务验证),捕获NO_DATA_FOUND(预定义)和自定义异常。
  • 外层块: 处理内层未处理的异常,执行后续业务逻辑或全局错误处理。

异常传播:

  • 内层处理并解决: 如e_negative_salary异常被捕获后重置工资,程序继续执行外层代码。
  • 内层重新抛出: NO_DATA_FOUND在内层处理后通过RAISE传递到外层,触发外层对应处理程序。

自定义异常:

  • 使用RAISE_APPLICATION_ERROR抛出并关联错误代码,PRAGMA
    EXCEPTION_INIT将自定义异常绑定到特定错误号。

事务控制:

  • 外层异常处理中可包含ROLLBACK,确保数据一致性(根据实际业务需求调整)。

嵌套规则:

  • 内部块未处理的异常会自动传递到外层块
  • 使用RAISE可手动将异常传递到上层

四、其他处理
1. 错误日志记录

EXCEPTION
  WHEN OTHERS THEN
    INSERT INTO error_log (code, message, time)
    VALUES (SQLCODE, SQLERRM, SYSDATE);
    COMMIT;
    RAISE; -- 继续向上层传递异常
END;

2. 动态错误消息

RAISE_APPLICATION_ERROR(-20001, '订单 ' || order_id || ' 状态无效');

3. 异常传播控制

BEGIN
  -- 业务逻辑
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE = -2290 THEN
      DBMS_OUTPUT.PUT_LINE('约束违反');
    ELSE
      RAISE; -- 继续传播未明确处理的异常
    END IF;
END;

五、总结
优先级处理:

EXCEPTION
  WHEN NO_DATA_FOUND THEN ... -- 特定异常在前
  WHEN OTHERS THEN ...        -- 通用处理在后

事务控制:

BEGIN
  SAVEPOINT sp1;
  -- DML操作
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO sp1;
    RAISE;
END;

错误代码规范:

  • 自定义错误代码范围:-20000 到 -20999
  • 统一错误消息格式

通过合理使用异常处理机制,可显著提升Oracle程序的健壮性。建议在复杂业务逻辑中优先定义清晰的异常处理策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读前言if name ‘main’parse_opt函数main函数run函数不同命令参数的推理结果常规推理命令推理命令(新增…

耳机插进电脑只有一边有声音怎么办 解决方法分享

当您沉浸在音乐或电影中时&#xff0c;如果突然发现耳机只有一边有声音&#xff0c;这无疑会破坏您的体验。本文将提供一系列检查和修复方法&#xff0c;帮助您找出并解决问题&#xff0c;让您的耳机恢复正常的立体声效果。 一、检查耳机连接是否正常 首先需要确认耳机与播放设…

Dp通用套路(闫式)

闫式dp分析法&#xff1a; 从集合角度来分析DP问题。 核心思想&#xff1a; DP是一种求有限集中的最值或者个数问题 由于集合中元素的数量都是指数级别的&#xff0c;直接用定义去求&#xff0c;把每种方案都用dfs暴力枚举一遍&#xff0c;时间复杂度很高&#xff0c;此时用…

华为设备端口隔离

端口隔离的理论与配置指南 一、端口隔离的理论 基本概念 端口隔离&#xff08;Port Isolation&#xff09;是一种在交换机上实现的安全功能&#xff0c;用于限制同一VLAN内指定端口间的二层通信。被隔离的端口之间无法直接通信&#xff0c;但可通过上行端口访问公共资源&#…

RabbitMq(尚硅谷)

RabbitMq 1.RabbitMq异步调用 2.work模型 3.Fanout交换机&#xff08;广播模式&#xff09; 4.Diret交换机&#xff08;直连&#xff09; 5.Topic交换机&#xff08;主题交换机&#xff0c;通过路由匹配&#xff09; 6.Headers交换机&#xff08;头交换机&#xff09; 6…

GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)

GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09; 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09;效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…

数据分析怎么做?高效的数据分析方法有哪些?

目录 一、数据分析的对象和目的 &#xff08;一&#xff09;数据分析的常见对象 &#xff08;二&#xff09;数据分析的目的 二、数据分析怎么做&#xff1f; &#xff08;一&#xff09;明确问题 &#xff08;二&#xff09;收集数据 &#xff08;三&#xff09;清洗和…

stm32之TIM定时中断详解

目录 1.引入1.1 简介1.2 类型1.2.1 基本定时器1.2.2 通用定时器1. 触发控制单元 (Trigger Control Unit)2. 输入捕获单元 (Input Capture Unit)3. 输出比较单元 (Output Compare Unit)4. CNT 计数器5. 自动重装载寄存器 (ARR)6. 预分频器 (PSC)7. 中断与 DMA 事件8. 刹车功能 (…

【el-admin】el-admin关联数据字典

数据字典使用 一、新增数据字典1、新增【图书状态】和【图书类型】数据字典2、编辑字典值 二、代码生成配置1、表单设置2、关联字典3、验证关联数据字典 三、查询操作1、模糊查询2、按类别查询&#xff08;下拉框&#xff09; 四、数据校验 一、新增数据字典 1、新增【图书状态…

【LUT技术专题】ECLUT代码解读

目录 原文概要 1. 训练 2. 转表 3. 测试 本文是对ECLUT技术的代码解读&#xff0c;原文解读请看ECLUT。 原文概要 ECLUT通过EC模块增大网络感受野&#xff0c;提升超分效果&#xff0c;实现SRLUT的改进&#xff0c;主要是2个创新点&#xff1a; 提出了一个扩展卷积&…

大物重修之浅显知识点

第一章 质点运动学 例1 知识点公式如下&#xff1a; 例2 例3 例4 例5 例6 第四章 刚体的转动 例1 例2 例3 例4 例5 例6 第五章 简谐振动 例1 例2 例3 第六章 机械波 第八章 热力学基础 第九章 静电场 第十一章 恒定磁场…

并发设计模式实战系列(16):屏障(Barrier)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第十六章屏障&#xff08;Barrier&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 屏障的同步机制 2. 关键参数 二…

算法探秘:和为K的子数组问题解析

算法探秘:和为K的子数组问题解析 一、引言 在算法的奇妙世界里,数组相关的问题总是层出不穷。“和为K的子数组”问题,看似简单,实则蕴含着丰富的算法思想和技巧。它要求我们在给定的整数数组中,找出和为特定值K的子数组个数。通过深入研究这个问题,我们不仅能提升对数组…

电力MOSFET的专用集成驱动电路IR2233

IR2233是IR2133/IR2233/IR2235 系列驱动芯片中的一种,是专为高电压、高速度的电力MOSFET和IGBT驱动而设计的。该系列驱动芯片内部集成了互相独立的三组板桥驱动电路,可对上下桥臂提供死区时间,特别适合于三相电源变换等方面的应用。其内部集成了独立的运算放大器可通过外部桥…

Qt 的原理及使用(1)——qt的背景及安装

1. Qt 背景介绍 1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形 界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模 式&#xff0c;开发者可以通过简单的拖拽…

范式之殇-关系代数与参照完整性在 Web 后台的落寞

最近参加了一个PostgreSQL相关的茶会&#xff0c;感慨良多。原本话题是PostgreSQL 在 SELECT 场景中凭借其成熟的查询优化器、丰富的功能特性和灵活的执行策略&#xff0c;展现出显著优势。在窗口函数&#xff08;Window Functions&#xff09;、JOIN 优化、公共表表达式&#…

广西某建筑用花岗岩矿自动化监测

1. 项目简介 某矿业有限公司成立于2021年&#xff0c;是由某建筑材料有限公司与个人共同出资成立&#xff0c;矿区面积0.4069平方公里&#xff0c;可开采筑用花岗岩、建筑用砂岩。建筑用花岗岩、建筑用砂岩可利用资源量分别为6338.69万吨、303.39万吨&#xff0c;设计生产规模…

想更好应对突发网络与业务问题?需要一款“全流量”工具

目录 什么是“全流量”&#xff1f; 为什么“全流量”在突发问题中如此重要&#xff1f; 1. 抓住问题发生的“第一现场” 2. 绕开日志盲区 3. 精准应对安全威胁 实战场景下的“全流量”价值体现 实施“全流量”需要注意哪些点&#xff1f; 1. 数据量巨大&#xff0c;需…

C#里创建一个MaterialDesign3的导航条

本文里主要创建如下的窗口: 在这里就是实现左边的导航窗口的列表。 第一步先要定义下面的代码: <Window x:Class="MDIXWindow.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microso…

Oracle OCP认证考试考点详解083系列09

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 41. 第41题&#xff1a; 题目 解析及答案&#xff1a; 关于应用程序容器&#xff0c;以下哪三项是正确的&#xff1f; A) 它可以包含单个…