三种类型的异常错误:
- 1. 预定义 ( Predefined )错误
- ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。
- 2. 非预定义 ( Predefined )错误
- 即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
- 3. 用户定义(User_define) 错误
- 程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。
注意:异常处理可以按任意次序排列,但 OTHERS 必须放在最后
实例
预定义错误
DECLARE
V_STR VARCHAR2(20);
BEGIN
SELECT NAME INTO V_STR FROM
( SELECT 'AA' AS NAME , '20210101' AS DT FROM DUAL UNION ALL
SELECT 'AC' AS NAME , '20210102' AS DT FROM DUAL UNION ALL
SELECT 'AD' AS NAME , '20210102' AS DT FROM DUAL ) A
WHERE A.DT = TO_CHAR(SYSDATE,'YYYYMMDD') ;
DBMS_OUTPUT.PUT_LINE(V_STR);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('今日无数据');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('今日有多条数据');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
非预定义错误
DECLARE
exception_name EXCEPTION;
PRAGMA EXCEPTION_INIT(exception_name, -903);
/* ORA-00903: 表名无效 */
BEGIN
DELETE FROM departments WHERE id = 12;
EXCEPTION
WHEN exception_name THEN
DBMS_OUTPUT.PUT_LINE('表名无效!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
用户自定义错误
DECLARE
exception_name EXCEPTION;
BEGIN
DELETE FROM departments WHERE id = 12;
IF SQL%NOTFOUND THEN
RAISE exception_name ;
END IF;
DBMS_OUTPUT.PUT_LINE('删除:'||SQL%ROWCOUNT||' 条数据');
COMMIT;
EXCEPTION
WHEN exception_name THEN
DBMS_OUTPUT.PUT_LINE('无数据!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;