自定义异常声明

语法

exception_declaration ::=

参数

exception

声明的异常名称。

注解

建议不要重定义数据库中已经预定义的异常,会使预定义异常失效。有关详细信息及预定义异常名称的列表,请参见“预定义异常”。

说明

自定义异常用来声明用户指定的异常名称。

可以使用 PRAGMA EXCEPTION_INIT 将此名称分配给内部定义的异常(使用方法见下方示例,数据库错误号参见 “SQL 错误信息”)。

示例

示例1: 重新定义预定义标识符

DROP TABLE TAB_EXCEPTION CASCADE;
CREATE TABLE TAB_EXCEPTION(col INT);

INSERT INTO TAB_EXCEPTION VALUES(1);
INSERT INTO TAB_EXCEPTION VALUES(2);
INSERT INTO TAB_EXCEPTION VALUES(3);

DECLARE
    i NUMBER;
BEGIN
    SELECT * INTO i FROM TAB_EXCEPTION;
EXCEPTION
    WHEN TOO_MANY_ROWS THEN -- 可被捕获到 TOO_MANY_ROWS 异常
        DBMS_OUTPUT.PUT_LINE('Too many rows.'); 
END;
/


DROP TABLE TAB_EXCEPTION CASCADE;

DECLARE
    i NUMBER;
BEGIN
    i = 10/0;
EXCEPTION
    WHEN TOO_MANY_ROWS THEN -- 不会捕获到 TOO_MANY_ROWS 异常,当前错误与该异常无关
        DBMS_OUTPUT.PUT_LINE('The divisor cannot be zero.'); 
END;
/


DECLARE
    i NUMBER;
    TOO_MANY_ROWS EXCEPTION;    -- 重新定义预定义的异常
    PRAGMA EXCEPTION_INIT(TOO_MANY_ROWS, 848297995); -- 848297995 为后台用来捕获零作为除数的错误号
BEGIN
    i = 10/0;
EXCEPTION
    WHEN TOO_MANY_ROWS THEN -- 可被捕获到 TOO_MANY_ROWS 异常,TOO_MANY_ROWS 被重定义
        DBMS_OUTPUT.PUT_LINE('The divisor cannot be zero.');
END;
/ 

示例2: 声明,提出和处理用户定义的异常

DROP PROCEDURE proc_exception;

CREATE PROCEDURE proc_exception(due_date DATE, today DATE) AUTHID DEFINER
IS
    exception_detected EXCEPTION;  -- 声明异常
BEGIN
    IF due_date < today THEN
        RAISE exception_detected;  -- 明确提出异常
    END IF;
EXCEPTION
    WHEN exception_detected THEN  -- 处理异常
        DBMS_OUTPUT.PUT_LINE('Account past due.');
END;
/
 
BEGIN
    proc_exception(TO_DATE('01-JUL-2010', 'DD-MON-YYYY'), TO_DATE('09-JUL-2010', 'DD-MON-YYYY'));
END;
/


DROP PROCEDURE proc_exception;