PL/SQL 异常处理
Oracle系统异常分别为两大类:
预定义异常:Oracle系统自身提供
自定义异常:Oracle不知晓无法控制的异常,特定的业务逻辑。由用户在程序中定义,Oracle自动引发
Oracle常见的预定义异常
ZERO_DIVIDE 除数为零
ACCESS_INTO_NULL 企图为某个未初始化的对象的属性赋值
COLLECTION_IS_NULL 企图使用未初始化的集合元素
CURSOR_ALREADY_OPEN 企图再次打开已经打开的游标
INVALID_CURSOR 执行一个非法的游标操作
INVALID_NUMBER 企图将一个字符串转换为一个无效的数字而失败
LOGIN_DENIED 企图使用无效的用户名或者密码连接数据库
NO_DATA_FOUND select into 语句没有返回数据
ROWTYPE_MISMATCH 主游标变量与PL/SQL游标变量的返回类型不兼容
SELF_IS_NULL 使用对象类型时,使用空对象调用其方法
SUBSCRIPT_BEYOND_COUNT 元素下表超过嵌套表或者VARRAY的最大值
SUBSCRIPT_OUTSIDE_LIMIT 企图使用非法索引号引用嵌套表或者VARRAY的最大值
SYS_INVALID_ROWID 字符串向ROWID转换时的错误,因为该字符串不是一个有效的ROWID值
TIMEOUT_ON_RESOURCE Oracle在等待资源时超时
TOO_MANY_ROWS 执行select inot 语句时,结果集超过一行引发的异常
set serveroutput on
declare
var_1 number;
var_2 varchar2(50);
begin
select first_name,salary into var_2,var_1 from employees where job_id='AD_VP';
if sql%found then
dbms_output.put_line(var_2||'的工资是:'||var_1);
end if;
exception
when too_many_rows then
dbms_output.put_line('返回太多行。');
when no_data_found then
dbms_output.put_line('没有找到数据');
end;执行结果:
匿名块已完成
返回太多行。自定义异常包括错误编号异常和业务逻辑异常
错误编号异常使用:定义异常变量,关联错误号和异常变量名
一下为错误编号异常举例
insert into employees(employee_id) values(100)
错误报告:
SQL 错误: ORA-01400: 无法将 NULL 插入 ("HR"."EMPLOYEES"."LAST_NAME")
01400. 00000 - "cannot insert NULL into (%s)"
*Cause:
*Action:
set serveroutput on
declare var_exp exception;
pragma exception_init (var_exp, -01400);
begin
insert into employees(employee_id) values(100);
exception when var_exp then
dbms_output.put_line('注意存在列不允许为空');
end;执行结果
匿名块已完成
注意存在列不允许为空
业务逻辑异常使用:在程序中raise异常,当引发一个异常时,控制就会转到exception异常处理部分执行异常处理语句
set serveroutput on
declare
too_big_salary exception;
var_1 number;
begin
var_1:=10000;
update employees set salary=10000 where employee_id=101;
if var_1>=10000 then
raise too_big_salary;
end if;
exception
when too_big_salary then
dbms_output.put_line('工资超过最高限制!!');
rollback;
end;执行效果
匿名块已完成
工资超过最高限制!!
努力不会背叛 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。