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年 5月 4日
  • 链家app的几项常用功能

    链家APP通过较为严格和规范的管理,保证了房源较好的真实性,其APP成为了众多看房客首选的工具,让客户第一时间了解每一个片区、楼盘的市场行情,吸引了不少的流量(虽然最后成交不一定在…

    2023年 11月 8日
  • qq号被盯上怎么办,qq号被人知道会有什么影响啊

    用户在日常使用中应有良好的账号保密习惯 最近,QQ号被盗事件频发。用户黄先生的QQ号十多天前突然间被盗,盗号者利用黄先生的QQ号码向很多联系人发送了不良信息;随后,黄先生的两位同事…

    2022年 12月 29日
  • 软文文案怎么写吸引人,文案软文怎么写吸引人

    在网络比较发达的现在,商业软文成为目前很多企业都在使用的一种推广手段,好的商业软文不仅可以提高客源,增大人流量,也能更好地助力企业快速发展,那么高质量的软文究竟应该如何写呢? 1、…

    2023年 6月 14日
  • 手机如何免费歌曲到内存卡(怎么用手机免费歌曲到内存卡)

    手机里可以免费下载歌曲,占用手机内存很小,简单又安全 在数字时代,手机已经成为我们日常生活的不可或缺的一部分。其中,音乐是许多人生活中的重要组成部分,我们常常通过手机来欣赏各种音乐…

    2023年 10月 20日
  • 支付宝搜索是什么梗

    近段时间经常刷朋友圈的小伙伴们是不是经常看见支付宝在吗这个文案,看起来有的很暧昧,有的很煽情,反正就是内心很懂你们。但是也有的小伙伴称支付宝搜索在吗没有反应,这是为什么呢?下面就和…

    2023年 3月 13日
  • 值得推荐的加湿器的使用方法,彻底梳理加湿器选购全指南

    一、为什么需要加湿器二、加湿器的工作原理(简单版)三、加湿器怎么选?四、实战,加湿器实测五、加湿器推荐 【全文10350字,阅读大约12分钟】 大家好,我是 馒头牛牛,之前写净水器…

    2023年 6月 10日
  • 创业实训日志7篇,皮蛋妈妈创业日志

    今天整理qq空间发现 2016年11月30日 刚开始创业一年写的日志 当时的记忆 现在看来真的好珍贵 好在我没有忘记初心 一直在我想走的路上 接下来带大家看2016年的我 发自肺腑…

    2023年 4月 3日
  • bt种子搜索器最新版

    Q1、什么是BT种子啊? A:长成下面这样, 后缀名为.torrent的”变态“家伙…… Q2、BT种子有什么用呢? A:当然是下载资源啦 (包括但不限于电影、软件、游戏) Q3、…

    2023年 8月 21日
  • 如何提高抖音点赞量和粉丝数量,抖音直播得10000抖音币到手多少钱

    其实提高了短视频的播放量,就可以获得收益。这篇文章主要给大家介绍如何提高抖音播放量,抖音播放量赚钱的4个方法。 播放量越多说意味着人气越高,则可以通过视频的播放量来赚钱,那么如何提…

    2023年 4月 15日