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

xiaoxiao2021-02-28  94

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

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

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

转载请注明原文地址: https://www.6miu.com/read-63105.html

最新回复(0)