目录
5. 使用 RAISE_APPLICATION_ERROR 抛出自定义错误信息
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. 用户定义异常
用户定义异常的步骤:
- 声明异常:在
DECLARE
部分声明一个异常变量。 - 抛出异常:使用
RAISE
语句在逻辑条件下触发异常。 - 处理异常:在
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;