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.31 非预定义异常演示