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

相关推荐

  • win10ipv6无网络访问权限怎么解决

    win10电脑上ipv6无internet访问限制怎么解决?近期有Win10用户体现,设置连接ipv6网络的情况下,很常常碰到电脑上ipv6无internet访问限制的难题,那麼W…

    2023年 10月 4日
  • 绝地求生新沙漠地图bug在哪里

    自从绝地求生上次更新了沙漠地图以后,网上就一片议论之声,褒贬不一两方各执其词。有人认为新地图更大,画质色调相比老地图更好,也有人认为新地图太黄了也看不太习惯,而且太大碰不到人,各位…

    2023年 5月 7日
  • 三大运营商自查不限量套餐,将规范宣传行为及资费公示

    现在智能手机已经成为了人们上网的一个重要途径,根据中国互联网络信息中心发布的《第39次中国互联网络发展状况统计报告》显示,截至2016年12月,我国手机网民规模已达6.95亿,比2…

    2023年 8月 1日
  • 如何在microsoft word中打出表格

    欢迎观看 Microsoft Word 中文版教程,小编带大家学习 Microsoft Word 的使用技巧,了解如何在 Word 中插入表格。 快速插入表格,选择「插入」-「表格…

    2023年 4月 13日
  • 现在做百度贴吧引流还有意义吗(百度贴吧引流推广方法是什么)

    我们今天的主题,主要要跟大家分享一下我们关于百度引流的一个理论部分,一些注意事项。 我们团队有很多的伙伴阿,都在做引流,但是有的伙伴的话他的引流效果好,有的伙伴他的引流效果就很差,…

    2023年 5月 23日
  • pbe测试服无法连接至验证服务

    新赛季的《云顶之弈》主题为“怪兽来袭”。在新版本中,英雄强化将为玩家提供三种英雄强化选择,你可以从中选择一种,为你的英雄小队确定自己的领 袖。每个弈子都有两种专属的英雄强化。这样可…

    2023年 10月 5日
  • 梁辉狼性营销实战训练专家,营销鬼才训练方法

    梁辉老师 狼性营销实战训练专家 中山大学管理学院MBA 4D领导力认证讲师 国际职业训练协会认证培训师 四川大学等多所高校总裁班特聘讲师 曾任:泰康人寿广州分公司丨营销总监 曾任:…

    互联网 2023年 4月 27日
  • 如何提高微博中奖几率

    为庆祝iG夺冠,王思聪于2018年11月6日通过微博发布冠军之月庆祝抽奖活动。其中第一波活动中抽取113个人(为了庆祝11月3日夺冠),每个人可以收到一万元现金。11日下午14:0…

    2023年 3月 15日
  • ems和挂号信收取方式有什么区别

    除了费用,EMS与普通挂号信最大的区别在于传递速度的不同,EMS比挂号信快多了.除此以外,如果邮件损毁丢失,赔偿标准也不相同,挂号信赔偿是邮资的两倍,而EMS的赔偿标准比挂号信要高…

    2023年 5月 26日
  • 网络营销专业学什么课程

    随着互联网的兴起,越来越多的互联网用户,也让更多的企业开始选择通过网络营销的方式获得用户,市场的人才需求也是比较大。既然网络营销既有市场又有人群,也让我们好多小伙伴对网络营销感兴趣…

    2023年 4月 16日