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

相关推荐

  • 为什么微信红包不能撤回了(微信红包怎么不能撤回)

    在微信上,各类在聊天框中发布的内容都可以撤回,但是唯独红包不可以?那么这么设计背后有什么深意吗?我们又要如何理解呢? 我看到这个问题的第一反应是:嗯?不能撤回吗?哦,是不能撤回。 …

    2023年 7月 2日
  • 微博热搜可以花钱控制,热搜小技巧

    早前,北京网信办约谈新浪微博负责人,针对微博干扰网上传播秩序以及传播违法、违规信息等问题,责令其立即整改,暂停更新微博热搜榜和热门话题榜一周。然而在饱受争议的微博热搜背后,还有不少…

    2023年 2月 7日
  • 做企业宣传,用h5在线制作工具可以吗

    做企业宣传,用H5在线制作工具 若企业想采用较新颖的宣传方式来开展企业活动,那么H5在线制作工具就可以成为你的首选。H5页面以其低成本、灵活、操作性强、趣味性强等优点被众多企业采用…

    2023年 5月 11日
  • 手机和电脑互传文件为啥这么麻烦

    如今的智能手机与电脑都已经非常普及,在使用手机或者电脑的时候我们经常会遇到手机和电脑之间、手机与手机之间互传文件的情况。一般情况,大多数人都会使用微信或者QQ来传输文件。虽然它们能…

    2023年 1月 6日
  • 淘宝mcn机构入驻条件和流程,淘宝mcn机构申请入口

    淘宝618活动以及来袭,今年的淘宝直播和点淘APP将进行双端资源联动。淘宝直播会新增亿级曝光助力商家直播。例如在活动期间,手淘的首页会新增店播入口,扩大公域流量渗透; 店铺LIVE…

    2023年 6月 21日
  • 简易式的宝宝餐椅哪个品牌质量好

    618已经要开始了,这个时候买母婴产品优惠力度还是很大的,不过买什么宝宝餐椅好呢,下面我来给大家盘点几款目前比较热门的产品,给大家做一个参考。 哈卡达餐椅 哈卡达餐椅算是最常见的一…

    2023年 7月 18日
  • npm包网速慢怎么办,npm速度过慢的解决方案

    写在前面 相信很多人在使用npm下载依赖包的时候,都遇到过一个非常常见的问题,那就是:下载速度太慢~~~ 那么今天给大家介绍一些提升npm下载速度的方法,还不清楚的朋友要收藏好了哟…

    2023年 7月 17日
  • matlab内置的随机函数(如何用matlab展示随机过程)

    1、rand-均匀分布 rand 产生由在(0, 1)之间均匀分布的随机数。 rand returns a single uniformly distributed random …

    2023年 7月 26日
  • 三大宽带对比,哪家性价比最高?网速最稳定

    移动、联通和电信是国内三大主要通讯公司,大部分人安装宽带时,都会选择其中一家,相信很多人和小编一样心里一直都有个执念就是电信的宽带是最快最稳定的,也许是人云亦云,说得多了,很多人都…

    2023年 3月 10日
  • 为什么在拼多多买东西那么便宜

    在过去的十多年的时间里,国内电商快速崛起,刚开始是阿里巴巴旗下的淘宝和京东平分秋色,后来拼多多异军突起,抢占了很大一块市场份额。现在国内电商业已经成为阿里、京东、拼多多三足鼎立的局…

    2023年 2月 5日