这次说明PL/SQL包的异常定义。
在PL/SQL中,为了处理错误,经常使用异常(例外)名记述例外处理程序。
对于常见的错误,例外名是预先定义好的(这被称为预定义例外),程序里边会使用这个定义好的例外名。
但是,有些错误是事先未定义的例外,这时候可以在申明部中自行定义例外名称,同时需要定义一个系统错误编号与之相对应。
这是所谓的用户定义异常(例外)。
自定义异常语法
<<声明部>>
–例外名称声明
例外名 EXCEPTION;
–例外名与系统错误编号的对应
PRAGMA EXCEPTION INIT(例外名,系统错误编号);
但是,在PL/SQL块内的本地声明部进行自定义的异常,只能在该块中使用。
其他的PL/SQL程序中无法使用,也要定义自己的同样的例外名。这就麻烦了?如何定义一个所有plsql都可以用的异常呢。
这时候,使用PL/SQL的包的话,就可以解决这个问题。
也就是说,上述异常定义不是在PL/SQL的本地申明,而是预先在包的申明部进行声明。
这样,其他的PL/SQL程序也可以使用这个定义的自定义异常。
请看下面的例子:
SQL> CREATE OR REPLACE PACKAGE PAC1
2 IS
3 FK_ERROR EXCEPTION;
4 PRAGMA EXCEPTION_INIT(FK_ERROR,-2292);
5 END;
6 /
包已创建。
上述是PAC1包中申明了一个异常名称:FK_ERROR,将该异常与系统错误编号-2922相对应。
ORA-2292错误是违反外键约束规则相关的错误。
因此,由于该包里边定义了ORA-2292错误,其他plsql程序就可以直接利用PAC1.FK_ERROR这个例外名来进行异常处理。
请看下面的例子:
SQL> DECLARE
2 V DEPTNO NUMBER:=&部门编号;
3 BEGIN
4 DELETE FROM DEPT WHERE DEPTNO = V_DEPTNO;
5 EXCEPTION
6 WHEN PAC1.FK_ERROR THEN
7 DBMS_OUTPUT.PUT_LINE(‘存在员工的部门:’ || V DEPTNO
8 || ‘不能被删除’);
9 END;
10 /
请在部门编号中输入值:10
DEPTNO NUMBER:=10;
存在员工的部门:10不能被删除
PL/SQL过程成功完成。
在第4行的DELETE文中,由于外键限制,想要删除员工所在部门(部门编号10),这时候会违反外键约束的错误(ORA-2292),
第6行的“PAC1.FK_ERROR”例外处理程序会进行错误处理,“存在员工的部门:10不能被删除”的信息就会被显示出来。
如上所述,如果在包申明部声明用户定义异常,并使之与系统错误编号相对应,
在其他PLSQL程序和函数中就可以直接使用改自定义异常进行例外处理了。
这就是包里自定义异常的好处。