pl/sql之异常处理

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

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

异常处理的语法

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

预定义异常

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

  • no_data_found 无数据找到
  • too_many_rows 返回多条数据
  • zero divide 除数不能零
  • cursor_already_open 打开已经打开的游标
  • value_error 赋值异常
  • invalid_cursor 失效的游标
  • 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值