数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle异常分类小记


发布日期:2022年08月27日
 
Oracle异常分类小记

前几天看《Oracle PL/SQL Programming》的异常处理部分粗粗看了一遍觉得有点乱根据自己的理解作了一下分类并相应给了一些简例不一定很准确供参考

Oracle 异常

具名Oracle异常

Oracle为此类异常预先指定了异常号异常信息异常名称

匿名Oracle异常

Oracle为此类异常预先指定了异常号异常信息但未指定异常名称

自定义异常

普通自定义异常

Oracle无关的业务逻辑异常无异常号异常信息异常名称需要手工声明

应用程序异常Raise_Application_Error

Oracle无关的业务逻辑异常此方法抛出的异常可以自定义异常号及异常信息可以通过Exception_Init绑定到手工声明的异常名称上

)Oracle异常

Oracle异常总是由Oracle检测并自动抛出的

)具名Oracle异常

Oracle定义了个具名的Oracle异常比如

Dup_val_on_index(ora)当中唯一索引所对应的列上键入重复值时

No_data_found(ora)执行select into未返回行或者引用了索引表未初始化的元素时

流程

A)在Exception模块按异常名进行处理

示例

DECLARE

num number;

BEGIN

num:=/;

EXCEPTION

when ZERO_DIVIDE then

dbms_outputput_line(SQLERRM);

END;

/

ORA: divisor is equal to zero

PL/SQL procedure successfully completed

)匿名Oracle异常

Oracle中存在大量匿名的异常比如

ORA: parent key not found

由于PL/SQL的异常处理模块只接受异常名称不接受异常号(除了WHEN OTHERS语句它可以捕获任意异常不论你是否具有异常名称)为便于处理需要手工为其指定异常名称

流程

A)声明异常

B)将此异常绑定到Oracle异常号上

C)在Exception模块按异常名进行处理

示例

DECLARE

ex EXCEPTION;

PRAGMA EXCEPTION_INIT(ex);

BEGIN

insert into t values();

EXCEPTION

when ex then

dbms_outputput_line(SQLERRM);

END;

/

ORA: integrity constraint (ADMINFK) violated parent key not found

PL/SQL procedure successfully completed

)自定义异常

自定义异常总是开发者显式抛出来的

)普通自定义异常

流程

A)声明异常

B)使用Raise语句抛出异常

C)在Exception模块按异常名进行处理

示例

DECLARE

ex EXCEPTION;

BEGIN

RAISE ex;

EXCEPTION

when ex then

dbms_outputput_line(SQLERRM);

dbms_outputput_line(i raised a userdefined exception ex);

END;

/

UserDefined Exception

i raised a userdefined exception ex

)应用程序异常Raise_Application_Error(Num Msg)

普通自定义异常既没有异常号(SQLCODE一律为也不能指定异常信息(SQLERRM一律为UserDefined Exception如果想要为自定义异常指定异常号与异常信息需要借助Raise_Application_Error(Num Msg)函数这里的Num即异常号范围是[]Msg则是异常信息

对于此类异常由于Num是自定义的因此应该有相应的管理办法以避免重复使用异常号比如可以将已使用的异常号保存在一张数据库中表以便将来检查

流程

A)声明异常

B)将此异常绑定到自定义的异常号上

C)使用Raise_Application_Error(Num Msg)抛出异常同时指定了异常号及异常信息

D)在Exception模块按异常名进行处理

示例

CREATE OR REPLACE PROCEDURE mtest

is

ex EXCEPTION;

PRAGMA EXCEPTION_INIT(ex );

BEGIN

Raise_Application_Error(raising my exception);

EXCEPTION

when ex then

dbms_outputput_line(SQLERRM);

END;

/

Procedure created

SQL> exec mtest

ORA: raising my exception

PL/SQL procedure successfully completed

               

上一篇:图解Oracle9i在Windows2000下的安装(1)

下一篇:Oracle 10g 中管理物化视图变得更加容易