ORACLE 异常错误处理
发布日期:2025-04-29 13:39:47 浏览次数:20 分类:精选文章

本文共 3177 字,大约阅读时间需要 10 分钟。

异常处理是PL/SQL程序中处理未预料事件的核心机制。以下是对异常处理的详细分析和实践指南。

5.1 异常处理概念

程序运行过程中,可能会遇到各种异常情况。这些异常可以分为以下几类:

  • 预定义错误:ORACLE提供了大约24种预定义错误,这些错误无需程序中手动定义,ORACLE会自动触发异常处理。
  • 非预定义错误:这些是标准的ORACLE错误,需要程序中手动定义处理。
  • 用户定义错误:程序员自定义的异常情况,需要显式触发。
  • 5.1.1 预定义异常处理

    预定义异常处理是ORACLE为程序自动提供的错误类型。常见的预定义错误包括:

    错误号 错误信息 说明
    ORA-0001 Dup_val_on_index 违反了唯一性限制
    ORA-0051 Timeout-on-resource 等待资源时发生超时
    ORA-1001 Invalid-CURSOR 试图使用无效的游标
    ORA-1422 Too_many_rows SELECT INTO返回多行
    ORA-1476 Zero-divide 试图被零除
    ORA-1722 Invalid-NUMBER 转换数字失败
    ORA-6500 Storage-error 内存不足引发的内部错误
    ORA-6501 Program-error 内部错误
    ORA-6502 Value-error 转换或截断错误
    ORA-6511 CURSOR-already-OPEN 试图打开已打开的游标
    ORA-6530 Access-INTO-null 试图为null对象赋值
    ORA-6531 Collection-is-null 集合方法应用于null表或varray
    ORA-6532 Subscript-outside-limit 索引引用超出范围
    ORA-6533 Subscript-beyond-count 索引引用大于集合元素个数
    ORA-6510 Resource-exhausted 资源耗尽

    这些预定义错误可以直接引用其错误代码进行处理。

    5.1.2 非预定义异常处理

    对于非预定义错误,需要在程序中手动定义异常情况并与ORACLE错误关联。步骤如下:

  • 在定义部分定义异常情况:
    EXCEPTIONWHEN exception_name THEN
  • 使用 PRAGMA EXCEPTION_INIT 将异常情况与错误代码关联:
    PRAGMA EXCEPTION_INIT(exception_name, error_code);
  • 在异常处理部分对异常情况进行处理。
  • 5.1.3 用户自定义异常处理

    用户定义异常通过 RAISE 语句显式触发。例如:

    RAISE my_exception;

    当异常被触发时,控制转移到异常处理部分,执行相应的错误处理代码。

    5.1.4 用户定义的异常处理

    可以使用 RAISE_APPLICATION_ERROR 函数重新定义异常错误消息。语法如下:

    RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]);

    error_number 范围在 -20000 到 -20999 之间,error_message 最多 2048 字节,keep_errors 为可选参数。

    5.2 异常错误传播

    异常错误可以在声明部分或执行部分引发,影响不同块的执行。

    5.2.1 执行部分引发异常错误

    当异常错误在执行部分引发时:

  • 如果当前块定义了异常处理,执行相应处理,程序继续执行。
  • 如果没有定义处理,异常传播到包含块处理。
  • 5.2.2 声明部分引发异常错误

    如果声明部分引发异常错误,可能会影响其他块。例如:

    BEGIN    DECLARE        name varchar2(12) := 'EricHu';    BEGIN        EXCEPTION            WHEN OTHERS THEN                raise another_exception;        END;    END;EXCEPTION    WHEN OTHERS THEN        raise another_exception;END;

    如果 nameNULL,虽然 EXCEPTION 块中有 WHEN OTHERS 处理,但由于错误在声明部分,WHEN OTHERS 不会被执行。

    5.3 异常错误处理编程

    在编程时,建议使用异常处理以避免程序终止。例如:

    DECLARE    v_sal number(7,2);BEGIN    SELECT salary INTO v_sal FROM employees WHERE employee_id = v_empno;    IF v_sal <= 1500 THEN        UPDATE employees SET salary = salary + 100 WHERE employee_id = v_empno;        DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!');    ELSE        DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!');    END IF;EXCEPTION    WHEN NO_DATA_FOUND THEN        DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');    WHEN TOO_MANY_ROWS THEN        DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');    WHEN OTHERS THEN        DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);END;

    5.4 使用 SQLCODE 和 SQLERRM

    SQLCODE 返回遇到的 Oracle 错误号,SQLERRM 返回错误信息。例如:

    • SQLCODE = -100,SQLERRM = 'no_data_found'
    • SQLCODE = 0,SQLERRM = 'normal, successful completion'

    5.5 使用 RAISE_APPLICATION_ERROR 存入错误信息

    CREATE TABLE errors (errnum number(4), errmsg varchar2(100));DECLARE    err_msg varchar2(100);BEGIN    FOR err_num IN -100 .. 0 LOOP        err_msg := SQLERRM(err_num);        INSERT INTO errors VALUES (err_num, err_msg);    END LOOP;END;

    5.6 使用 RAISE_APPLICATION_ERROR 阻止错误

    CREATE OR REPLACE TRIGGER tr_insert_empBEFORE INSERT ON employeesFOR EACH ROWBEGIN    IF :new.first_name IS NULL OR :new.last_name IS NULL THEN        RAISE_APPLICATION_ERROR(-20000, 'Employee must have a name.');    END IF;END;
    上一篇:oracle 执行一条查询语句,把数据加载到页面或者前台发生的事情
    下一篇:Oracle 序列sequence 开始于某个值(10)执行完nextval 发现查出的值比10还小的解释

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2026年06月21日 18时34分29秒