7.6.4 非预定义异常

Oracle中的异常更多都是非预定义异常。也就是说,它们只有错误编号和相关的错误描述,而没有名称的异常是不能被捕捉的。为了解决该问题,Oracle允许开发人员为这样的异常添加一个名称,使得它们能够被异常处理模块捕捉到。

为一个非预定义异常定义名称需要如下两步:

1)声明一个异常的名称。

2)把这个名称和异常的编号相互关联。

Oracle处理预定义异常和非预定义异常并没有区别。

【示例26】关联非预定义异常示例

由于产品表PRODUCTINFO中的产品类型引用了产品类型表CATEGROYINFO的编码,所以当修改产品类型编码时有可能造成PRODUCTINFO产生垃圾数据。为了避免这种情况,表PRODUCTINFO中可以使用外键约束。这时如果直接修改PRODUCTINFO表中的产品类型编码,就有可能导致ORA-02291错误。


01 DECLARE

02 v_ctgy VARCHAR2(10);

03

04 my_2291_exp EXCEPTION;

05 PRAGMA EXCEPTION_INIT(my_2291_exp,-2291);

06

07 BEGIN

08 v_ctgy:='1111111111';

09 UPDATE PRODUCTINFO SET PRODUCTINFO.CATEGORY=v_ctgy;

10

11 EXCEPTION

12 WHEN my_2291_exp THEN

13 DBMS_OUTPUT.PUT_LINE('违反完整约束条件,未找到父项关键字!');

14 DBMS_OUTPUT.PUT_LINE('SQLERRM:'||SQLERRM);

15 DBMS_OUTPUT.PUT_LINE('SQLCODE:'||SQLCODE);

16 ROLLBACK;

17

18 END;

19 /


【代码解析】

❑第4行表示声明异常的名称:my_2291_exp。

❑第5行利用PRAGMA EXCEPTION_INIT把异常名称和数据库错误号关联。

❑第9行表示修改表PRODUCTINFO中产品类型编码的数据。

❑从第11行开始为异常处理块,第12行为异常名称列表,这里使用了my_2291_exp。也就是说,当出现-2291这个异常时,会被第12行捕捉。

❑第14行中的SQLERRM表示错误信息。

❑第15行中的SQLCODE为错误代码。

【执行效果】

在SQL*Plus中执行脚本,执行过程见图7.31。

7.6.4 非预定义异常 - 图1

图 7.31 非预定义异常演示