文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Oracle异常分类小记

Oracle异常分类小记

时间:2010-12-02  来源:SnowToday

Oracle 异常

具名Oracle异常

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

匿名Oracle异常

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

自定义异常

普通自定义异常

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

应用程序异常(Raise_Application_Error)

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


1)Oracle异常

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

1.1)具名Oracle异常

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

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

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

流程:

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

示例:

DECLARE
  num number;
BEGIN
  num:=1/0;
EXCEPTION
when ZERO_DIVIDE then
  dbms_output.put_line(SQLERRM);
END;
/

ORA-01476: divisor is equal to zero

PL/SQL procedure successfully completed


1.2)匿名Oracle异常

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

ORA-02291: parent key not found

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

流程:

A)声明异常

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

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

示例:

DECLARE
   ex EXCEPTION;
   PRAGMA EXCEPTION_INIT(ex,-2291);
 BEGIN
  insert into t2 values(2);
EXCEPTION
when ex then
  dbms_output.put_line(SQLERRM);
END;
 /

ORA-02291: integrity constraint (ADMIN.FK1) violated - parent key not found

PL/SQL procedure successfully completed


2)自定义异常

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

2.1)普通自定义异常

流程:

A)声明异常

B)使用Raise语句抛出异常

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

示例:

DECLARE
  ex EXCEPTION;
BEGIN
  RAISE ex;
EXCEPTION
when ex then
  dbms_output.put_line(SQLERRM);
  dbms_output.put_line('i raised a user-defined exception ''ex''');
END;
/

User-Defined Exception

i raised a user-defined exception 'ex'


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

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

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

流程:

A)声明异常

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

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

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

示例:

CREATE OR REPLACE PROCEDURE mtest
is
  ex EXCEPTION;
  PRAGMA EXCEPTION_INIT(ex, -20001);
BEGIN
  Raise_Application_Error(-20001,'raising my exception.');
EXCEPTION
when ex then
  dbms_output.put_line(SQLERRM);
END;
/

Procedure created

SQL> exec mtest

ORA-20001: raising my exception.

PL/SQL procedure successfully completed

 

相关阅读 更多 +
排行榜 更多 +
瓢虫少女

瓢虫少女

飞行射击 下载
潜艇鱼雷

潜艇鱼雷

飞行射击 下载
网络掠夺者

网络掠夺者

飞行射击 下载