oracle怎么创建异常 oracle自定义异常处理

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_output put_line(SQLERRM);

END;

/

ORA : divisor is equal to zero

PL/SQL procedure successfully pleted

)匿名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_output put_line(SQLERRM);

END;

/

ORA : integrity constraint (ADMIN FK ) violated parent key not found

PL/SQL procedure successfully pleted

)自定义异常

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

)普通自定义异常

流程

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

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

普通自定义异常既没有异常号(SQLCODE一律为 ) 也不能指定异常信息(SQLERRM一律为 User Defined 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_output put_line(SQLERRM);

END;

/

Procedure created

SQL exec mtest

ORA : raising my exception

lishixinzhi/Article/program/Oracle/201311/18175

oracle抛出自定义的异常用什么关键字

如果用自定义异常则可以创建如下代码

Sql代码

declare

row_count int;

begin

select count(*) into row_count from tree_table where parent_id = '0001' ;

if (row_count 0) then

RAISE_APPLICATION_ERROR(-20001, '该节点有子节点,不能被删除。');

end if;

select count(*) into row_count from tree_table where id = '0001' and status 1 ;

if (row_count 0) then

RAISE_APPLICATION_ERROR(-20002, '该节点已被确认,不能被删除。');

end if;

delete from tree_table where id = '0001';

end;

oracle 用户自定义异常

--设:要抛出的异常叫做ex_no_data,要判断是否小于0的变量为:v_data,则:

DECLARE

--声明异常

ex_no_data EXCEPTION; -- Exception to indicate an error condition

v_data NUMBER; -- Variable to hold data

--v_ErrorCode NUMBER; -- Variable to hold the error message code

--v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN

--抛出异常

IF v_data 0 THEN --(括号内填抛出异常的条件)

RAISE ex_no_data;

END IF;

--捕捉异常

EXCEPTION

WHEN ex_no_data THEN

dbms_output.put_line(v_data);

--捕捉其他异常,并获得 捕获异常的内容

WHEN OTHERS THEN

null;

-- v_ErrorCode := SQLCODE;

-- v_ErrorText := SUBSTR(SQLERRM, 1, 200);

-- 注意这里用SUBSTR 来截取错误消息

--dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);

END;

/

---另可参考我之前的一个帖子:

如何处理用户自定义异常 oracle

当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。

对于这类异常情况的处理,步骤如下:

1、在PL/SQL 块的定义部分定义异常情况:

异常情况  EXCEPTION;

2、RAISE 异常情况;

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

例:更新指定员工工资,增加100;

DECLARE

v_empno employees.employee_id%TYPE :=empno;

no_result  EXCEPTION;

BEGIN

UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;

IF SQL%NOTFOUND THEN

RAISE no_result;

END IF;

EXCEPTION

WHEN no_result THEN 

DBMS_OUTPUT.PUT_LINE('数据更新语句失败了!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END;

1、弹出错误框:

示例代码:

declare

v_count number;

begin

select count(*) into v_count from dept;

if v_count 10 then

raise_application_error(-20001,'数量小于10');

end if;

end;

执行结果:

2、控制台显示:

示例代码:

declare

v_count number;

my_exp exception;

begin

select count(*) into v_count from dept;

if v_count 10 then

raise my_exp;

end if;

exception

when my_exp then

dbms_output.put_line('数量小于10');

when others then

dbms_output.put_line('其他异常');

end;

执行结果:

PS:ORACLE 用户自定义异常小例子:

CREATE OR REPLACE PROCEDURE test_Exception_byLeejin

(

ParameterA IN varchar,

ParameterB IN varchar,

ErrorCode OUT varchar --返回值,错误编码

)

AS

/*以下是一些变量的定义*/

V NUMBER;

V nvarchar();

V NUMBER;

APP_EXP EXCEPTION; --自定义异常

BEGIN

ErrorCode :='';

IF (ParameterA=ParameterB) THEN

ErrorCode := 'ParameterA = ParameterB';

RAISE APP_EXP; -- 抛出异常

END IF;

EXCEPTION

WHEN APP_EXP THEN --在处理异常

RAISE_APPLICATION_ERROR(-,ErrorCode);

WHEN OTHERS THEN

RAISE_APPLICATION_ERROR(-,'未知异常');

END;


分享文章:oracle怎么创建异常 oracle自定义异常处理
文章链接:http://azwzsj.com/article/hgpgdg.html