Oracle 预定义异常及应用
Oracle 提供了一些预定义的异常,这些异常涵盖了常见的错误情况;同时提供了SQLERRM函数来获取当前会话中最近一次触发的异常信息。SQLERRM函数返回一个字符串,该字符串包含了最近抛出的异常的错误消息。另一个相关的函数是SQLCODE,它返回最近一次抛出的异常的错误代码。
-
ACCESS_INTO_NULL
- 含义: 当试图访问或分配尚未初始化的嵌套表或VARRAY变量时抛出此异常。
-
CASE_NOT_FOUND
- 含义: 当没有与CASE语句的选择值匹配的分支,并且没有指定ELSE部分时抛出此异常。
-
COLLECTION_IS_NULL
- 含义: 当对未初始化的嵌套表或VARRAY变量进行操作时抛出此异常。
-
CURSOR_ALREADY_OPEN
- 含义: 当试图打开一个已经打开的游标时抛出此异常。
-
DUP_VAL_ON_INDEX
- 含义: 当试图插入一个重复值到一个唯一索引列时抛出此异常。
-
INVALID_CURSOR
- 含义: 当对一个无效的游标进行操作(如关闭已经关闭的游标或从未打开的游标中获取数据)时抛出此异常。
-
INVALID_NUMBER
- 含义: 当在数值转换中发生错误时抛出此异常。例如,将非数值字符串转换为数字时会抛出此异常。
-
LOGIN_DENIED
- 含义: 当用户试图登录到Oracle数据库但被拒绝时抛出此异常。
-
NO_DATA_FOUND
- 含义: 当SELECT INTO语句没有返回任何行时抛出此异常。
-
NOT_LOGGED_ON
- 含义: 当用户试图执行需要连接到数据库的操作但未登录时抛出此异常。
-
PROGRAM_ERROR
- 含义: 当PL/SQL程序内部发生意外错误时抛出此异常。
-
ROWTYPE_MISMATCH
- 含义: 当查询返回的行与变量或记录类型不匹配时抛出此异常。
-
SELF_IS_NULL
- 含义: 当试图访问未初始化的对象类型的成员时抛出此异常。
-
STORAGE_ERROR
- 含义: 当PL/SQL程序运行时发生存储分配错误时抛出此异常。
-
SUBSCRIPT_BEYOND_COUNT
- 含义: 当对集合(嵌套表或VARRAY)的子脚本超出实际元素个数时抛出此异常。
-
SUBSCRIPT_OUTSIDE_LIMIT
- 含义: 当对集合的子脚本超出允许范围时抛出此异常。
-
SYS_INVALID_ROWID
- 含义: 当提供的ROWID无效时抛出此异常。
-
TIMEOUT_ON_RESOURCE
- 含义: 当资源分配操作超时时抛出此异常。
-
TOO_MANY_ROWS
- 含义: 当SELECT INTO语句返回多于一行时抛出此异常。
-
VALUE_ERROR
- 含义: 当值类型不匹配或无法完成类型转换时抛出此异常。
-
ZERO_DIVIDE
- 含义: 当试图除以零时抛出此异常。
示例
处理预定义异常的示例函数:
CREATE OR REPLACE FUNCTION example_function(p_emp_id IN NUMBER) RETURN VARCHAR2 IS
v_emp_name VARCHAR2(100);
BEGIN
SELECT first_name || ' ' || last_name INTO v_emp_name
FROM employees
WHERE employee_id = p_emp_id;
RETURN v_emp_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '没有找到该员工。错误代码:' || SQLCODE || ' 错误信息:' || SQLERRM;
WHEN TOO_MANY_ROWS THEN
RETURN '找到多个员工。错误代码:' || SQLCODE || ' 错误信息:' || SQLERRM;
WHEN VALUE_ERROR THEN
RETURN '值错误。错误代码:' || SQLCODE || ' 错误信息:' || SQLERRM;
WHEN OTHERS THEN
RETURN '发生了其他错误。错误代码:' || SQLCODE || ' 错误信息:' || SQLERRM;
END;
详细解释
- NO_DATA_FOUND:
- 当查询没有返回任何行时触发此异常。
- 使用SQLCODE获取错误代码,使用SQLERRM获取错误信息。
- TOO_MANY_ROWS:
- 当查询返回多于一行时触发此异常。
- 同样使用SQLCODE和SQLERRM获取相关的错误代码和信息。
- VALUE_ERROR:
- 当值类型不匹配或无法完成类型转换时触发此异常。
- 使用SQLCODE和SQLERRM获取错误代码和信息。
- OTHERS:
- 捕获所有其他未处理的异常。
- 返回错误代码和错误信息,以便进行进一步分析。