自定义异常声明¶
示例¶
示例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;