Oracle异常处理及举例(Oracle预定义异常和自定义异常)

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;
执行效果

匿名块已完成
工资超过最高限制!!

努力不会背叛
博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。

你可能感兴趣的:(Oracle,study)