「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。
8.1 预定义异常
DECLARE
BEGIN
......
EXCEPTION
WHEN 异常名称 THEN
--异常处理语句
--异常可使用SQLCODE输出错误编码,以及使用SQLERRM来输出错误信息:
dbms_output.put_line('值类型错误' || SQLCODE || SQLERRM);
WHEN 异常名称 THEN
异常处理语句
………
WHEN OTHERS THEN
异常处理语句
所有异常种类:
- ACCESS_INTO_NULL 在未初始化对象时出现
- CASE_NOT_FOUNF 在CASE语句中的选项与用户输入的数据不匹配时出现
- COLLECTION_IS_NULL 在给尚未初始化的表或数组赋值时出现
- CURSOR_ALREADY_OPEN 用户试图重新打开已经打开的游标时出现。在重新打开游标前必须先将其关闭
- INVALID_CURSOR 在执行非法游标运算(如fetch一个尚未打开的游标)时出现
- LOGIN_DENIED 输入的用户名或密码无效时出现
- SOTRAGE_ERROR 在内存损坏或PL/SQL耗尽内存时出现
- DUP_VAL_ON_INDEX 用户试图将重复的(duplicate)值存储在使用唯一索引的数据库列中时出现(insert into student (id) values(1) 1为已存在的id)
- INVALID_NUMBER 将字符串转换为数字时出现(select id into i from student where name = 3)
- NO_DATA_FOUND 在表中不存在请求的行时出现(select id into i from student where id = -1)
- TOO_MANY_ROWS 在执行SELECT INTO语句后返回多行时出现(select id into i from student)
- VALUE_ERROR 变量中的列值超出变量的大小或类型(i number(1); i:='a';)
- ZERO_DIVIDE 以零做除数时出现(i number; i:=1/0)
示例:
DECLARE
i number;
str varchar2(10) := '1';
BEGIN
select id into i from student;
EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('值类型错误' || SQLCODE || SQLERRM);
WHEN ZERO_DIVIDE THEN
dbms_output.put_line('0不能做被除数' || SQLCODE || SQLERRM);
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('返回了太多行,i只能接收一个' || SQLCODE || SQLERRM);
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('没有返回行,i无法完成赋值' || SQLCODE || SQLERRM);
WHEN ACCESS_INTO_NULL THEN
dbms_output.put_line('变量没有初始化' || SQLCODE || SQLERRM);
WHEN INVALID_NUMBER THEN
dbms_output.put_line('数字不能转为字符串' || SQLCODE || SQLERRM);
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('索引重复' || SQLCODE || SQLERRM);
WHEN OTHERS THEN
dbms_output.put_line('未知错误' || SQLCODE || SQLERRM);
END;
8.1.1 非预定义异常 (自定义异常)
Oracle允许自定义的错误代码的范围为-20000 -- -20999
示例1:
DECLARE
BEGIN
RAISE_APPLICATION_ERROR(-20001,'I am sorry to see you');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line( SQLCODE ||' '|| SQLERRM);
END;
示例2:
DECLARE
myexception exception;
BEGIN
RAISE myException;
EXCEPTION
WHEN myexception THEN
RAISE_APPLICATION_ERROR(-20001,'I am sorry to see you');
END;