一、概念

用户定义的异常错误是通过显式使用 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;


注意:

  1.     用户自定义的异常,异常编号从 -20001开始。

  2.     某给定异常最多由异常处理部分的一个处理器进行处理。如果有多个异常处理器,则PL/SQL编   译器产生PLS-00483错误。

  3. QLCODE返回当前错误代码,SQLERRM返回当前错误的消息文本。对于用户自定义异常SQLCODE返回值为‘1’,SQLERRM返回值为‘User-defined Exception’。

  4. Oracle错误信息的最大长度是512字节。

  5. SQLCODE和SQLERRM的值先赋给本地变量,不能直接用于SQL语句。


三、异常执行机制

  1.     如果当前块对该异常错误设置了处理,则执行它并成功完成该块的执行,然后控制转给包含块。

  2.     如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。然后对该包含块执行步骤1。


四、在PL/SQL中如何输出异常发生的行号及异常代码

    只需在异常块中加入下列代码即可。

    EXCEPTION
     WHEN OTHERS THEN
        dbms_output.put_line( SQLERRM || '-' || dbms_utility.format_error_backtrace);