【Oracle数据库】异常处理

本文探讨了Oracle PL/SQL中的预定义错误(如no_data_found和too_many_rows)、非预定义错误(通过自定义异常v_deptno_error)以及自定义错误(如v_sal_error的实例)。讲解了如何使用异常处理来捕获并响应不同类型的错误,包括如何抛出和处理异常。

预定义错误

declare
  v_emp emp%rowtype;

begin

  select empno, ename  into v_emp.empno, v_emp.ename
   from emp   where empno = '1111'; --信息是不存在的
  
  dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);
  
end;

  • 使用goto跳转
declare
  v_emp emp%rowtype;

begin

  goto many;

  select empno, ename  into v_emp.empno, v_emp.ename
   from emp   where empno = '1111'; --信息是不存在的
  
  dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);
  
  <<many>>
  
  select empno, ename into v_emp.empno, v_emp.ename from emp; --信息数据返回多行
   
  dbms_output.put_line(v_emp.empno || '和' || v_emp.ename);*\

  --异常处理
exception
  --no_data_found :无数据发现,固定写法
  when no_data_found then
    dbms_output.put_line('员工信息不存在!'); --执行语句,可以打印,也可以增(插入一条员工信息)删改查数据
    --too_many_rows :返回数据过多  
  when too_many_rows then
    dbms_output.put_line('返回数据过多!');
  
end;

非预定义错误

–预定义和非预定义指的是,动作类型系统是否已经定义好,比如
–no_data_found :无数据发现,系统预定义好的写法,–too_many_rows :返回数据过多

declare
  --定义异常
  v_deptno_error exception;

  --错误跟定义好的错误变量想关联
  pragma exception_init(v_deptno_error, -00001); --当报-00001错误码的时候,定义错误为“v_deptno_error”

begin
  update emp set empno = 88 where deptno = 30;
/*exception
  --错误处理*/
exception
  when v_deptno_error then   --当出现‘v_deptno_error’错误时,报“没有该部门编号!”
    dbms_output.put_line('没有该部门编号!');
end;
select * from emp

自定义错误

即出现某种情况,我就可以定义其为异常

declare
  v_sal emp.sal%type;
  v_sal_error exception;
  
 /* 注:  
  自定义可以不用加入关联,不用管这句
  pragma exception_init(v_sal_error,-06550);*/

begin
  select sal into v_sal from emp where empno = 7900;
  
  if (v_sal < 3000) then
  
    --1、抛出异常
   /* raise v_sal_error;*/
  
    --2、定义抛出异常编码值
    raise_application_error(-20000, '薪资问题');
  
  end if;

/*exception
 
 when v_sal_error then
    dbms_output.put_line('薪资少于3000');
  when others then
    dbms_output.put_line('系统异常');*/
  
end;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值