前几天看《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