目录
异常定义
异常关联
异常捕获与处理
查询 emp 数据表中工作岗位是 MANAGER 的员工信息,如果不存在这个员工,则输出“没有数据记录返回”,如果存在多个记录,则输出“返回数据记录超过一行”
更新数据表 emp 中部门编号,由于该部门编号与 dept 数据表中字段 deptno 相关联,因此会出现错误“ORA-02291: 违反完整约束条件(SCOTT.FK_DEPTNO) - 未找到父项关键字”,编程进行这种异常处理
更新 emp 表中的信息,如果没有发现记录,则进行异常处理
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
在 PL/SQL 程序中,错误处理的基本步骤如下
异常定义
在声明部分定义错误异常,其中预定义异常系统已经定义,其他两种异常需要用户定义。基本语法如下所示。
异常变量 excption
如果是非预定义的异常,还需要为错误编号关联这个异常变量,基本语法如下所示。
prama excption_init(异常变量,-######)
其中,“#####”为 Oracle 的错误编号
异常关联
在执行部分当错误发生的时候关联与错误对应的异常。
由于系统可以自动识别 Oracle 内部错误,所以当错误发生时系统会自动关联与之对应的预定义异常或非预定义异常,
但是,用户定义的错误,系统无法自动识别,需要用户编程用于关联,关联的语法如下所示
raise user_define_recption
异常捕获与处理
当错误产生的时候,在异常处理部分通过异常处理器捕获异常并进行异常处理。其基本语法如下所示。
EXCEPTION
WHEN 异常 1 [OR 异常......] THEN 处理序列语句 1;
WHEN 异常 2 [OR 异常......] THEN 处理序列语句 2;
...
WHEN 异常 n [OR 异常......] THEN 处理序列语句 n ;
END;
一个异常只能被一个异常处理器捕获,并进行处理。
一个处理器可以捕获多个异常,此时通过 OR 连接。
查询 emp 数据表中工作岗位是 MANAGER 的员工信息,如果不存在这个员工,则输出“没有数据记录返回”,如果存在多个记录,则输出“返回数据记录超过一行”
分析:
这个范例属于预定义异常的情况,在查询数据记录的时候,如果出现多行记录或者没有记录时,
Oracle 系统内部对这些情况有对应的处理,用户无须在程序中定义,是由 Oracle 自动触发
在异常处理部分,根据捕获的异常情况,执行不同的操作
更新数据表 emp 中部门编号,由于该部门编号与 dept 数据表中字段 deptno 相关联,因此会出现错误“ORA-02291: 违反完整约束条件(SCOTT.FK_DEPTNO) - 未找到父项关键字”,编程进行这种异常处理
分析:
这属于非预定义异常,由于预定义异常只是与一部分 Oracle 错误相连的异常,
所以如果要处理没有与预定义异常对应的 Oracle 错误时,则需要为这些 Oracle 错误声明相应的非预定义异常。
声明这样的异常需要使用 EXCEPTION_INIT 编译指令
通过 EXCEPTION_INIT,一个自定义异常只能和一个 Oracle 错误相连,在异常处理语句中,捕获这个异常,显示指定提示信息
前面介绍的预定义异常和非预定义异常,都有 Oracle 系统判断的错误。
下面这个范例是自定义异常的处理,自定义异常由 RAISE 语句产生,当一个异常产生时,
控制权立即转交给块的异常处理部分。其中 RAISE 抛出异常有 3 种方法
(1)RAISE EXCEPTION :用于抛出当前程序中定义的异常或在 standard 中的系统异常。
(2)RAISE PACKAGE.EXCEPTION :用于抛出定义在非标准包中的有一些异常,如 UTL_FILE,DBMS_SQL 以及程序员创建的包中异常
(3)RAISE :不带任何参数,这种情况只出现在希望将当前的异常传到外部程序时
更新 emp 表中的信息,如果没有发现记录,则进行异常处理
通过 RAISE 抛出异常,然后在异常处理部分显示自定义结果