plsql自定义异常处理

抛出异常

Oracle有三种类型的异常错误:

1. 预定义(Predefined)异常

ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

2. 非预定义(Predefined)异常

即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

3. 用户定义(User_define)异常

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

在PL/SQL中有三种方式抛出异常

通过PL/SQL运行时引擎——抛出Oracle异常

使用RAISE语句——抛出用户定义异常

调用RAISE_APPLICATION_ERROR存储过程——抛出用户定义异常

非预定义异常

因为非预定义异常只有编号,没有名称,所以不能直接处理。

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

<异常情况> EXCEPTION;

2、将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:

PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

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

INSERT INTO departments VALUES(50, ‘FINANCE’, ‘CHICAGO’);

DECLARE

v_deptno departments.department_id%TYPE := &deptno;

deptno_remaining EXCEPTION; –1、定义异常

PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); –2、关联

— -2292 是违反一致性约束的错误代码

BEGIN

DELETE FROM departments WHERE department_id = v_deptno;

EXCEPTION

WHEN deptno_remaining THEN –3、处理

DBMS_OUTPUT.PUT_LINE(‘违反数据完整性约束!’);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||’—‘||SQLERRM);

END;

用户自定义异常处理

用户定义的异常错误是通过显式使用 RAISE 语句来触发。

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

2、RAISE <异常情况>;

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

DECLARE

v_empno employees.employee_id%TYPE :=&empno;

no_result EXCEPTION; –1、定义

BEGIN

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

IF SQL%NOTFOUND THEN

RAISE no_result; –2、抛出

END IF;

EXCEPTION

WHEN no_result THEN –3、处理

DBMS_OUTPUT.PUT_LINE(‘你的数据更新语句失败了!’);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||’—‘||SQLERRM);

END;

RAISE_APPLICATION_ERROR

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,将应用程序专有的错误从服务器端转达到客户端应用程序。它为应用程序提供了一种与ORACLE交互的方法。

语法如下:

RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors] );

error_number 是从 –20,000 到 –20,999 之间的参数,这样就不会与 ORACLE 的任何错误代码发生冲突

error_message 是相应的提示信息(< 2048 字节),

keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

There are two uses for RAISE_APPLICATION_ERROR.

The first is to replace generic Oracle exception messages with our own, more meaningful messages.

The second is to create exception conditions of our own, when Oracle would not throw them.

create or replace procedure new_emp

( p_name in emp.ename%type

, p_sal in emp.sal%type

, p_job in emp.job%type

, p_dept in emp.deptno%type

, p_mgr in emp.mgr%type

, p_hired in emp.hiredate%type := sysdate )

is

invalid_manager exception; –1、定义

PRAGMA EXCEPTION_INIT(invalid_manager, -2291); –2、关联

dummy varchar2(1);

begin

if trunc(p_hired) > trunc(sysdate)

then

raise_application_error

(-20000, ‘NEW_EMP::hiredate cannot be in the future’); –3、抛出自定义异常

end if;

insert into emp

( ename

, sal

, job

, deptno

, mgr

, hiredate )

values

( p_name

, p_sal

, p_job

, p_dept

, p_mgr

, trunc(p_hired) );

exception

when dup_val_on_index then

raise_application_error

(-20001, ‘NEW_EMP::employee called ‘||p_name||’ already exists’, true); –3、包装Oracle异常

when invalid_manager then

raise_application_error

(-20002, ‘NEW_EMP::’||p_mgr ||’ is not a valid manager’); –3、包装自定义异常

end;

/

客户端调用时会提示详细异常信息:

— 测试RAISE_APPLICATION_ERROR自定义异常

SQL> exec new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 7782, sysdate+1)

BEGIN new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 7782, sysdate+1); END;

*

ERROR at line 1:

ORA-20000: NEW_EMP::hiredate cannot be in the future –ORA-20000

ORA-06512: at “APC.NEW_EMP”, line 16

ORA-06512: at line 1

— 测试RAISE_APPLICATION_ERROR包装自定义异常

SQL> exec new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 8888, sysdate)

BEGIN new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 8888, sysdate); END;

*

ERROR at line 1:

ORA-20002: NEW_EMP::8888 is not a valid manager

ORA-06512: at “APC.NEW_EMP”, line 42

ORA-06512: at line 1

— 测试RAISE_APPLICATION_ERROR包装Oracle异常

SQL> exec new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 7782, sysdate)

PL/SQL procedure successfully completed.

SQL>

SQL> exec new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 7782, sysdate)

BEGIN new_emp (‘DUGGAN’, 2500, ‘SALES’, 10, 7782, sysdate); END;

*

ERROR at line 1:

ORA-20001: NEW_EMP::employee called DUGGAN already exists

ORA-06512: at “APC.NEW_EMP”, line 37

ORA-00001: unique constraint (APC.EMP_UK) violated –同时打印原始堆栈

ORA-06512: at line 1

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 7月 20日 下午4:39
下一篇 2023年 7月 20日 下午4:45

相关推荐

  • ping通但是上不了网

    ip能ping通,但是就是无法上网,应该大部分网工都遇到过这种情况吧。 能ping通,说明ip是能够和网络设备通信的,但是上不了网,就要具体问题具体分析了。 今天聊点基础的,ip能…

    2023年 7月 2日
  • dota2gg战队为什么一下子这么猛

    在刚刚过去的DOTA2巴厘岛major比赛中,GG战队再次3:1战胜liquid,获得冠军,这是他们今年的第5个国际大赛冠军,major三连冠,梦幻联赛2连冠。 如果是经常关注DO…

    2023年 10月 23日
  • 最新蚂蚁花呗开通方法

    蚂蚁花呗是蚂蚁金服推出的一款消费信贷产品,用户在消费时,可以预支付蚂蚁花呗的额度,享受先消费,后付款的购物体验。那么,蚂蚁花呗怎么开通?蚂蚁花呗开通流程是什么? 首先登陆手机支付宝…

    2023年 2月 10日
  • 淘宝封店7天怎么解封?如何处理呢

    淘宝平台上面有开着各种各类的店铺,为了保证平台的交易顺利进行,淘宝有着自己的规则,若是淘宝有发现店铺有违规的行为,那么商家将会受到一些惩罚。那么淘宝封店7天怎么解封? 淘宝封店7天…

    2022年 12月 18日
  • 小屏电视能不能当显示器用

    最近笔者发现32寸的小尺寸电视最低价格已经跌至449元了,比正常32寸的显示器便宜不少。这时候我们就又遇到了一个老生常谈的问题,小尺寸的电视究竟能否代替大尺寸的显示器来使用。 很多…

    2023年 1月 7日
  • 提前搞明白京东这两种会员体系(中信京东plus卡怎么领取plus会员)

    马上又到一年一度的618购物节了,这也是每家电商平台的年中大促,优惠力度并不会输给双11和双12,所以各位值友可以开始准备准备,购物资金到位肯定是首要条件,然后是各家银行的信用卡也…

    2023年 4月 1日
  • dreamweaver快捷键注释

    运用Dreamweaver的过程中,熟练的使用快捷键,制作网页时能达到事半功倍的效果,在这里我们把DW的快捷方式整理出来,希望对大家熟练掌握Dreamweaver的知识有所帮助。 …

    2023年 7月 14日
  • apache安装教程详解

    介绍: Apache HTTP Server(简称Apache),是Apache软件基金会的一个开放源代码的网页服务器。 YUM安装方法: yum -y install httpd…

    2023年 6月 18日
  • 计算机二级ppt考点及详细方法

    今天是计算机二级考试的第一天,不少刚刚考完试的小伙伴们直呼”今年的题目又难了!”,”12月再战!”,然而,计算机考试还未结束,还没有上考场的小伙伴们都有机会,下面是小编为大家梳理的…

    2023年 10月 4日
  • 公司怎么注册企业微信(公司怎么注册企业微信号)

    公司注册企业微信是一种专业化的流程,它可以帮助企业建立内部沟通平台,提升工作效率和数据安全性。在这篇文章中,我将从不同角度描述企业微信的注册流程和相关优势。 一、注册前的准备工作 …

    2023年 8月 22日