奥德赛F9 发表于 2018-10-23 10:16:27

PL/SQL中自定义异常小知识

  一、概念
  用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
  对于这类异常情况的处理,步骤如下 :

[*]  在PL/SQL 块的声明部分定义异常情况 :EXCEPTION;
[*]  RAISE
[*]  在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
  二、程序
  --例1:使用自定义异常变量
  DECLARE
  v_empno emp.empno%TYPE :=&empno;
  no_resultEXCEPTION;--定义异常变量
  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_dnamedepartments.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);


页: [1]
查看完整版本: PL/SQL中自定义异常小知识