pl/sql 关于异常处理

一、前言

异常分为三类,预定义异常、非预定义异常、自定义异常。

注意:三种异常的区别,前两种异常是违反了oracle的规则,用户自定义异常是违反了用户定义的规则。

异常处理的语法:

EXCEPTION
   WHEN first_exception THEN 
   WHEN second_exception THEN 
   WHEN OTHERS THEN 
END;

二、预定义异常

ORACLE预定义的异常情况大约有21个。对这种异常情况的处理,无需在程序中定义声明,由ORACLE自动将其引发。

常见的异常有:

1、no_data_found 无数据找到
2、too_many_rows 返回多条数据
3、zero divide 除数不能零
4、cursor_already_open 打开已经打开的游标
5、value_error 赋值异常
6、invalid_cursor 失效的游标
7、dup_val_on_index 唯一索引插入重复值,即违反了主键约束

declare
  v_emp emp%rowtype;
begin
  select empno, ename into v_emp.empno, v_emp.ename from emp; --信息数据返回多行
  dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);

  --异常处理
exception
    when too_many_rows then
         dbms_output.put_line('返回数据过多!');
end;

三、非预定义异常

非预定义指的是,行为违反了oracle的规则,有报错编号和报错信息,但是系统并未定义异常名称,那么我们自己将这种错误定义一个名字,并将名字和错误号绑定。

declare
  --定义异常
  FK exception;
  --错误跟定义好的错误变量想关联
  pragma exception_init(FK, -02292); --当报-02292错误码的时候,定义错误为“FK”

begin
  delete from dept where deptno = 30;--如果没有异常处理,将报-02292,事实上是违反了外键约束
  
exception
  --错误处理
  when FK then   --当出现‘v_deptno_error’错误时,报“没有该部门编号!”
       dbms_output.put_line('违反了外键约束!');
end;

四、自定义异常

将某种错误是为异常,即出现某种情况,就可以定义其为异常。需要显性抛出(raise)。

自定义一个异常,并抛出:

declare
  v_sal emp.sal%type;
  v_sal_error exception;
begin
  select sal into v_sal from emp where empno = &empno;
  if (v_sal < 3000) then
    --2、定义抛出异常编码值raise_application_error(code错误码, '错误信息'),出现错误提示弹窗
    raise_application_error(-20000, '薪资问题,小伙子注意啦,要开除啦');
  end if;
end;

自定义一个异常,并处理:

declare
  v_sal emp.sal%type;
  v_sal_error exception;
begin
  select sal into v_sal from emp where empno = &empno;
  
  if (v_sal < 3000) then
    --1、抛出异常
    raise v_sal_error;  --抛出了异常名就一定要有处理,否则会报错
  else
    dbms_output.put_line(v_sal);
  end if;
exception
 when v_sal_error then
    dbms_output.put_line('薪资少于3000');
  when others then  --其他任意异常
    dbms_output.put_line('系统异常');
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值