[bbk5364]第19集 - Chapter 08 - Handling Exceptions(02)

Autonomous Transactions

Autonomous Transaction(AT),通过PRAGMA AUTONOMOUS_TRANSACTION;指明当前的事务操作只针对自身有效,不涉及到其他事务.

Trapping User-Defined Exceptions

Examples:

User-Defined Exception
DECLARE
        v_deptno NUMBER := 500;
        v_name   VARCHAR2(20) := 'Testing';
        e_invalid_department EXCEPTION;
BEGIN
        UPDATE dept SET department_name = v_name WHERE department_id = v_deptno;

        IF SQL%NOTFOUND THEN
                RAISE e_invalid_department;
        END IF;

        COMMIT;
EXCEPTION
        WHEN e_invalid_department THEN
                DBMS_OUTPUT.PUT_LINE('No such department id!');
END;

/

Propagating Exceptions in PL/SQL

  • When an exception is raised,if PL/SQL cannot find a handler for it in the current block or subprogram ,the exception propagates.
  • That is ,the exception reproduces itself in successive enclosing blocks until a handler is found or there are no more blocks to seache.
  • If no handler is found,PL/SQL returns an unhandled exception error to the host enviroment.

Propagating Exceptions in a Subblock

Propagating Rules:Example 1

Propagaing Rules:Example 2

Propagating Rules:Example3

RAISE_APPLICATION_ERROR Procedure

Syntax:

raise_application_error(error_number,message[,{TRUE|FALSE}]);
  • You can use this procedure to issue user-defined error messages from stored subprograms.
  • You can report errors to your applicaiton and avoid returning unhandled exceptions.
  • error_number is in the range-20000..-20999,message is a character string of at most 2-48 bytes.

RAISE_APPLICATION_ERROR Procedure

  • Is used in two different places:
    • -Executable section
    • -Exception section
  • Returns error conditions to the user in a manner consistent with other Oracle Server errros.

Executable section:

Exception section:

Example:

RAISE_APPLICATION_ERROR
DECLARE
        v_deptno NUMBER := 500;
        v_name VARCHAR2(20) := 'Testing';

        e_invalid_department EXCEPTION;
        PRAGMA EXCEPTION_INIT(e_invalid_department,-20188);
BEGIN
        UPDATE dept SET department_name = v_name WHERE department_id = v_deptno;

        IF SQL%NOTFOUND THEN
                RAISE_APPLICATION_ERROR(-20188,'This is your Error Message!');
        END IF;

        COMMIT;

EXCEPTION
        WHEN e_invalid_department THEN

                --DBMS_OUTPUT.PUT_LINE(SQLCODE || '->' || SQLERRM);
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

/

解析:

e_invalid_department EXCEPTION;                                                --定义一个EXCEPTION类型的变量,名称叫做e_invalid_department;

PRAGMA EXCEPTION_INIT(e_invalid_department,-20188);              --通过此函数指令,将-20188与异常类型变量e_valid_department进行关联;

RAISE_APPLICATION_ERROR(-20188,'This is your Error Message!'); --通过此过程,就可以将ERROR CODE: -20188与ERROR MESSAGE:'This is your Error Message进行关联';

完成上述几步之后,在后面的代码块中,就可以使用Oracle Server build in`s function:SQLCODE and SQLERRM;

posted @ 2013-04-24 17:27  ArcerZhang  阅读(306)  评论(0编辑  收藏  举报