`
Longmanfei
  • 浏览: 46647 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 异常处理(十六)

阅读更多

    异常是oracle 数据库中的 PL/SQL 代码在执行期间出现的错误。无论任何时候,当PL/SQL引擎执行代码时,都可能会遇到异常,当产生异常时,PL/SQL会将程序控制转到程序块的异常处理部分。

   如果在程序块中没有异常处理,那么异常就会传播,或者发往程序块德调用者。

   Oracle 3种类型的异常

预定义异常

对这种异常的处理,无须在程序中定义,由oracle 自动将其引发

非预定义异常

即其他标准的oracle 错误。对这种异常的处理,需要用户在程序中定义然后由oracle 自动将其引发。

自定义异常

如果程序设计人员认为某种情况违反了业务逻辑,则设计人员可明确定义并引发异常

    

异常处理部分一般放在PL/SQL程序的后半部分,其结构如下:

EXCEPTION

   WHEN first_exception THEN  <code to handle first exception>

   WHEN second_exception THEN  <code to handle second exception>

   WHEN OTHERS THEN  <code to handle orthers exception>

     END;

   预定义异常

     我们现在以已存在主键进行添加数据时捕获异常为例

    SQL> set serveroutput on;

SQL> 

SQL> begin

  2  insert into emp(empno,ename,job,deptno)

  3  values('7394','Longmanfei','stu',20);

  4  exception

  5  when dup_val_on_index  then      //dup_val_on_index注意这个异常的定义是oracle 规定的专门针对这种插入主键重复数据的

  6  dbms_output.put_line('捕获到了异常');

  7  dbms_output.put_line('该主键已存在');

  8  end;

  9  /

 

捕获到了异常

该主键已存在

 

PL/SQL procedure successfully completed

下面列举一下oracle 预定义的 异常

DUP_VAL_ON_INDEX

试图破坏一个唯一性限制

Timeout-on-resource

在等待资源时发生超时

Transanction-backed-out

由于发生死锁,事务被撤销

Invalid-CURSOR

视图使用一个无效的游标

Not-logged-on

没有连接到oracle 

Login-denied

无效的用户名/口令

NO_DATA_FOUND

Select into 没有找到数据

TOO_MANY_ROWS

Select into 返回多行

Access-INTO-null

试图为null对象的属性赋值

等等

非预定义异常

  对于非预定义异常,必须先对定义的oracle 错误进行定义

1. <异常情况>  exception

    例如定义一个 Fk_DELETE EXCEPTION

2. 使用exception_into 语句将已定义好的异常情况与标准的oracle 错误联系起来

   PRAGMA EXCEPTION_INTO(<异常情况><错误代码>);

自定义异常

<异常情况>  exception

PAISE  <异常情况>

之后

Declare

ex_update  exception;

Begin

Update 商品信息

Set 单价=单价-100

Where  商品编号='1030';

If  sql%notfound then

RAISE ex_update;

End if;

Exception

When ex_update then

dbms_output.put_line('捕捉到自定义异常');

dbms_output.put_line('未更新任何行');

End;

/

<!--EndFragment-->
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics