一、概念
用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常情况的处理,步骤如下 :
- 在PL/SQL 块的声明部分定义异常情况 :<异常情况> EXCEPTION;
- RAISE <异常情况>
- 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
二、程序
--例1:使用自定义异常变量
DECLARE
v_empno emp.empno%TYPE :=&empno;
no_result EXCEPTION;--定义异常变量
BEGIN
UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE(‘你的数据更新语句失败了!‘);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE ||’---‘|| SQLERRM);
END;
--例2:使用RAISE_APPLICATION_ERROR函数抛出异常
DECLARE
v_deptid departments.department_id%TYPE := &no;
v_dname departments.department_name%TYPE;
BEGIN
SELECT department_name
INTO v_dname
FROM departments
WHERE department_id = v_deptid;
dbms_output.put_line(v_dname);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,
‘department‘ || v_deptid ||
‘does not exists‘);
END;
注意:
- 用户自定义的异常,异常编号从 -20001开始。
- 某给定异常最多由异常处理部分的一个处理器进行处理。如果有多个异常处理器,则PL/SQL编 译器产生PLS-00483错误。
- QLCODE返回当前错误代码,SQLERRM返回当前错误的消息文本。对于用户自定义异常SQLCODE返回值为‘1’,SQLERRM返回值为‘User-defined Exception’。
- Oracle错误信息的最大长度是512字节。
- SQLCODE和SQLERRM的值先赋给本地变量,不能直接用于SQL语句。
三、异常执行机制
- 如果当前块对该异常错误设置了处理,则执行它并成功完成该块的执行,然后控制转给包含块。
- 如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。然后对该包含块执行步骤1。
四、在PL/SQL中如何输出异常发生的行号及异常代码
只需在异常块中加入下列代码即可。
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line( SQLERRM || ‘-‘ || dbms_utility.format_error_backtrace);