使用非预定义例外包括三步:首先在定义部分定义例外名,然后在例外和oracle错误之间建立关联,最终在例外处理部分捕捉并处理例外。
定义Oracle错误和例外之间的关系,需要使用伪过程EXCEPTION_INIT,以ORA-02291为例:
DECLARE
e_integerity EXCEPTION;
PRAGMA EXCEPTION_INIT(e_integerity,-2291);
BEGIN
UPDATE emp SET deptno=&dno WHERE empno=&eno;
EXCEPTION WHEN e_integerity then
dbms_output.put_line('该部门不存在');
END;
输入dno:11
输入empno:7788
例外函数RAISE_APPLICATION_ERRO的介绍:
里外函数包括SQLCODE(去的错误代号),SQLERRM(错误号所对应的错误消息)。
RAISE_APPLICATION_ERROR:只能在子程序中(存储过程、触发器、函数、包)使用,不能在匿名块中使用。错误号必须是在-20000到-20999之间。例子:
create or replace procedure raise_comm
(eno NUMBER,commission NUMBER)
IS
v_comm emp.comm%TYPE;
BEGIN
SELECT comm INTO v_comm FROM emp WHERE empno=eno;
IF v_comm IS NULL THEN
RAISE_APPLICATION_ERROR(-20001,'该雇员无补助');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('该雇员不存在');
END;