PL/SQL循序渐进全面学习教程--最后一课 异常处理

最后一课 异常处理本章重点:
  
  1、定义PLSQL异常
  2、列举不同的异常处理方法
  3、捕获非预期的错误
  4、描述异常的影响
  5、定制异常的返回信息[@more@]

最后一课 异常处理本章重点:
  
  1、定义PLSQL异常
  2、列举不同的异常处理方法
  3、捕获非预期的错误
  4、描述异常的影响
  5、定制异常的返回信息  

一、PLSQL异常处理
  异常是由ORACLE错误或显式的抛出一个错误产生的。
  如何处理:
  用一个处理程序来捕获它;
  将它传递给CALLING ENVIRONMENT
  二、异常的类型:
  ORACLE SERVER 预定义错误
  非ORACLE SERVER 预定义错误,但也是ORACLE SERVER 的标准错误
  用户自定义异常
  三、捕捉异常的要点:
  Place the WHEN OTHERS clause after all other exception handling clauses.
  
  You can have at most one WHEN OTHERS clause.
  
  Begin exception-handling section of the block with the keyword EXCEPTION.
  
  Define several exception handlers, each with their own set of actions, for the
  block.
  
  When an exception occurs, PL/SQL will process only one handler before leaving
  the block.
  EXCEPTION
  WHEN exception1 [OR exception2 . . .] THEN
  statement1;
  四、常用错误:
  NO_DATA_FOUND ORA-01403
  TOO_MANY_ROWS ORA-01422
  INVALID_CURSOR ORA-01001
  ZERO_DIVIDE ORA-01476
  DUP_VAL_ON_INDEX ORA-00001
  五、实例
  PROCEDURE elim_inventory
  (v_product_id IN s_product.id%TYPE) IS
  v_id s_product.id%TYPE;
  BEGIN
  SELECT id
  INTO v_id
  FROM s_product
  WHERE id = v_product_id;
  DELETE FROM s_inventory
  WHERE product_id = v_product_id;
  COMMIT;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
  ROLLBACK;
  TEXT_IO.PUT_LINE(TO_CHAR(v_product_id)||
  ’ is invalid.’);
  WHEN TOO_MANY_ROWS THEN
  ROLLBACK;
  TEXT_IO.PUT_LINE(’Data corruption in S_PRODUCT.’);
  WHEN OTHERS THEN
  ROLLBACK;
  TEXT_IO.PUT_LINE(’Other error occurred.’);
  END elim_inventory;
  在SCOTT环境中使用要稍加改动
  六、使用non-predefined Oracle7 Server error
  DECLARE
  E_PRO  EXCEPTION;
  PRAGMA EXCEPTION_INIT(E_PRO,ERROR_NUMBER);
  BEGIN
  ......
  EXCEPTION
  WHEN E_PRO THEN
  DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
  ......
  END;
  七、用户自定义
  exception EXCEPTION;
  RAISE exception;  EXCEPTION
  WHEN E_PRO THEN
  DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
  ......
  END;   这里,只有用户自定义异常是要显式声明的,其他两个不用。
  在SUN OS5.8中,进行SVRMGRL> OERR ORA 01840 可返回信息
  或查错误代码:
  HTTP://TECHNET.ORACLE.COM/DOC/SERVER.815/A67785/E1500.HTM
  题外话,create public database link otlink connect to system identified
  by manager using 'oratest';
  说回来,以下两个函数:
  SQLCODE ----Returns the numeric value for the error code. You can assign it
  to a NUMBER variable.
  SQLERRM ----Returns character data containing the message associated with
  the error number.
  一般这样,
  EXCEPTION
  ... WHEN OTHERS THEN
  ROLLBACK;
  v_error_code:=SQLCODE;
  V_ERROR_MESSAGE:=SQLERRM;
  INSERT INTO ........
  END;
  八、调用外围环境
  SQLPLUS
  PROCEDURE BUILDER
  DEVELOPER 2000
  OTHER .........
  ---- 也就是把ERROR NUMBER和MESSAGE输出到SCREEN。
  九、使用RAISE_APPLICATION_ERROR
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
  RAISE_APPLICATION_ERROR(-20201,'NO MATCH RECORD YOU WANNA');

请使用浏览器的分享功能分享到微信等