欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Oracle异常之非预定义异常 有大用 有大大用

非预定义异常:


处理预定义异常无关的其他异常.


 


非预定义异常的处理步骤:


1.在pl/sql块定义部分,定义异常情况:


<异常情况> pxception;


2.将其定义好的异常情况与比标准的Oracle错误联系起来,使用pragma exception语句:


pragma exception_init(<异常情况>,<错误代码>);


3.在pl/sql块的异常处理处理部分对异常情况做出相应的处理.


 


实例:删除dept表中指定部分的信息(数据来自Oracle默认数据表)


分析:dept表和emp表有主外键关系,当删除指定部门信息时,应确保该部门下没有员工.


 


如果不做异常处理的话,直接删除部门编号为10的部门信息.则会因为员工表中有部门为10的数据而报错:




 


下面做一下异常处理:


declare

  --1.定义非预定义异常的标识符

  e_fk exception;

  

  --2.把Oracle错误与异常建立关联

  -- -2292 违反外键约束的错误号

  pragma exception_init(e_fk,-2292);

 

begin

  delete from dept where deptno = 10;

  

  exception

    --捕捉并处理异常

    when e_fk then

      dbms_output.put_line('此部门下有员工,不能删除!');

    when others then

      dbms_output.put_line(sqlcode || '***' || sqlerrm);

end;

 

执行结果:




 


这样就成功捕捉到异常啦!

————————————————

版权声明:本文为CSDN博主「梁萌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/liangmengbk/article/details/100175453


来自 https://blog.csdn.net/liangmengbk/article/details/100175453



Oracle系统非预定义异常处理

在pl/sql 中,可以使用系统非预定义的异常,但是,我发现,绑定别的编号的异常都可以执行,例如01422(SELECT INTO 返回多行)等等,唯独01403异常(select into 没有找到数据异常)不行,系统会报错:
-------------------------------------------------------------------------------------------------
declare
lin varchar2(10);
myexception exception;
PRAGMA EXCEPTION_INIT(myexception, -1403);
begin
select empno into lin from emp where deptno = 22;
exception
when myexception then
DBMS_OUTPUT.PUT_LINE('没有返回行!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误!');
end;
-----------------------------------------------------------------
ORA-06550: 第3 行, 第3 列:
PLS-00701: PRAGMA EXCEPTION_INIT 的非法 ORACLE 错误号 -1403
--------------------------------------------------------------------
请大家不吝赐教
 我来答  举报
sxdtgsh
2011-09-15 · TA获得超过2194个赞
-1403在oracle中已经预定义了,异常名是:no_data_found
程序可以改成。
declare
lin varchar2(10);
begin
select empno
into lin
from emp
where deptno = 22;
exception
when no_data_found then
DBMS_OUTPUT.PUT_LINE('没有返回行!');
when too_many_rows then
DBMS_OUTPUT.PUT_LINE('返回多行!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他错误!');
end;
追问
其他的预定义异常都可以,就no_data_found不行
追答
试了一下,还真是这样。
难道1403比较特殊,或者是oracle的传说级bug.

来自  https://zhidao.baidu.com/question/319459436.html


普通分类: