最近接触到oracle存储,用到了一些异常处理,索性在这总结一下吧 一 常用异常分类
自定义异常预定义异常(常用异常)捕获oracle错误异常异常的SQLCode 和 SQL Errm 格式 例外:(意外)程序运行的过程发生异常,相当于是JAVA中的异常 declare --声明变量 begin --业务逻辑 exception --处理异常 when 异常1 then ... when 异常2 then ... when others then ...处理其它异常 end;1 预定义异常(常用异常)
zero_divide : 除零异常 value_error : 类型转换异常 too_many_rows : 查询出多行记录,但是赋值给了rowtype记录一行数据变量 no_data_found : 没有找到数据 自定义异常: 异常名 exception; raise 异常名 */ declare vi number; vrow emp%rowtype; begin --vi := 8/0; --vi := 'aaa'; --select * into vrow from emp; select * into vrow from emp where empno=1234567; exception when zero_divide then dbms_output.put_line('发生了除零异常'); when value_error then dbms_output.put_line('发生了类型转换异常'); when too_many_rows then dbms_output.put_line(' 查询出多行记录,但是赋值给了rowtype记录一行数据变量'); when no_data_found then dbms_output.put_line('没有找到数据异常'); when others then dbms_output.put_line('发生了其它异常' || sqlerrm); end;2 自定义异常
异常名:exception raise 异常名 * 游标来判断 %found %notfound 声明一个游标 声明一个变量,记录数据 从游标中取记录 如果有,则不管它 如果没有就抛出自定义的异常 */ declare --声明游标 cursor vrows is select * from emp where empno=8888; --声明一个记录型变量 vrow emp%rowtype; --声明一个自定义异常 no_emp exception; begin --1.打开游标 open vrows; --2.取数据 fetch vrows into vrow; --3.判断游标是否有数据 if vrows%notfound then raise no_emp; end if; close vrows; exception when no_emp then dbms_output.put_line('发生了自定义的异常'); end;3 捕获oracle错误
--捕获oracle错误异常 --未捕获异常 declare begin update emp set deptno = 80 where empno = '7788'; end; --捕获异常 declare my_err exception; pragma exception_init(my_err,-2291);--将错误信息和异常绑定 begin update emp set deptno=80 where empno='7788'; exception when my_err then dbms_output.put_line('主键不存在'); -- end ;4 异常的SQLCode 和 SQL Errm 由于ORACLE 的错信息最大长度是512字节,为了得到完整的错误提示信息,我们可用 SQLERRM和 SUBSTR 函数一起得到错误提示信息,方便进行错误,特别是如果WHEN OTHERS异常处理器时更为方便。
SQLCODE 返回遇到的Oracle 错误号 SQLERRM 返回遇到的Oracle错误信息 --万能捕获异常输出错误代码和错误信息 declare begin update emp set deptno=80 where empno='7788'; exception when others then dbms_output.put_line(SQLCODE || SQLERRM); end ;