plsql异常处理(EXCEPTION)

目录

1. 什么是异常?

2. 异常管理的结构

3. 预定义异常

常见的预定义异常:

4. 用户定义异常

用户定义异常的步骤:

5. 使用 RAISE_APPLICATION_ERROR 抛出自定义错误信息

6. 异常的顺序和 OTHERS 子句

7. 嵌套的异常处理


1. 什么是异常?

异常是指在程序运行过程中出现的错误或意外情况。PL/SQL 提供了一种机制,可以捕获这些错误并进行处理,而不是直接终止程序执行。

异常分为两大类:

  • 预定义异常:Oracle 预先定义的一些常见的错误,如除零、无数据发现等。

  • 用户定义异常:开发人员根据需要自定义的异常,用于处理业务逻辑中的特殊情况。

2. 异常管理的结构

BEGIN
    -- 正常执行代码
EXCEPTION
    WHEN exception_name THEN
        -- 异常处理代码
END;

3. 预定义异常

常见的预定义异常:
  • NO_DATA_FOUND:当 SELECT INTO 查询没有返回任何行时触发。
  • TOO_MANY_ROWS:当 SELECT INTO 查询返回多行时触发。
  • ZERO_DIVIDE:当尝试进行除零操作时触发。
  • INVALID_CURSOR:当游标操作不合法时触发。
DECLARE
    v_result NUMBER;
BEGIN
    -- 尝试进行除零操作
    v_result := 10 / 0;
EXCEPTION
    -- 捕获除零异常并处理
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('除零操作错误,无法进行除法运算。');
END;

4. 用户定义异常

用户定义异常的步骤:
  1. 声明异常:在 DECLARE 部分声明一个异常变量。
  2. 抛出异常:使用 RAISE 语句在逻辑条件下触发异常。
  3. 处理异常:在 EXCEPTION 块中处理异常。
DECLARE
    e_invalid_salary EXCEPTION;  -- 声明用户定义异常
    v_salary NUMBER := 5000;     -- 定义员工工资
BEGIN
    -- 业务逻辑:如果工资超出限制,抛出异常
    IF v_salary > 3000 THEN
        RAISE e_invalid_salary;  -- 触发异常
    END IF;
EXCEPTION
    -- 捕获并处理用户定义异常
    WHEN e_invalid_salary THEN
        DBMS_OUTPUT.PUT_LINE('工资超过限制,不能超过3000。');
END;

5. 使用 RAISE_APPLICATION_ERROR 抛出自定义错误信息

基本语句:RAISE_APPLICATION_ERROR(error_number, error_message);

  • error_number:自定义的错误编号,范围是 -20000-20999
  • error_message:自定义的错误消息,最多 2048 个字符。
DECLARE
    v_salary NUMBER := 5000;
BEGIN
    -- 如果工资超过限制,抛出带有错误信息的自定义异常
    IF v_salary > 3000 THEN
        RAISE_APPLICATION_ERROR(-20001, '工资超过限制,不能超过3000。');
    END IF;
EXCEPTION
    -- 捕获并处理自定义的异常
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);  -- 输出错误信息
END;

--输出结果:ORA-20001: 工资超过限制,不能超过3000。

6. 异常的顺序和 OTHERS 子句

BEGIN
    -- 一些可能引发异常的代码
    SELECT sal INTO v_salary FROM emp WHERE empno = 9999;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('没有找到对应的员工记录。');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('发生了未知的错误: ' || SQLERRM);
END;

7. 嵌套的异常处理

BEGIN
    BEGIN
        -- 内层块,可能引发异常
        RAISE NO_DATA_FOUND;  -- 手动触发异常
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('内层异常处理:没有找到数据。');
    END;

    -- 外层块
    DBMS_OUTPUT.PUT_LINE('外层代码继续执行。');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('外层异常处理:发生了其他错误。');
END;

8. 异常处理中的常用函数

  • SQLCODE:返回最近一次发生的异常的错误代码。
  • SQLERRM:返回最近一次发生的异常的错误消息
BEGIN
    -- 可能引发异常的代码
    v_result := 10 / 0;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('错误代码: ' || SQLCODE || ', 错误信息: ' || SQLERRM);
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值