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-->