oracle 异常详解(亲测有效)

最近接触到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 ;

你可能感兴趣的:(oracle)