读书人

Oracle 错误处理(十六)

发布时间: 2012-07-05 07:59:17 作者: rapoo

Oracle 异常处理(十六)

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

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

???Oracle?有3种类型的异常

l?预定义异常

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

l?非预定义异常

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

l?自定义异常

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

????

异常处理部分一般放在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-->

读书人网 >其他数据库

热点推荐