Oracle入门(十四.16)之捕获用户定义的异常

一、异常类型

本文讨论用户定义的错误。



二、捕获用户定义的异常

PL / SQL允许你定义你自己的异常。 您根据应用程序的要求定义异常。


输入数据期间需要用户定义的异常的一个示例。 假设您的程序提示用户输入部门编号和名称,以便它可以更新部门的名称。 当用户进入无效部门时会发生什么? 该代码不会产生Oracle错误。 你需要定义一个预定义的用户错误来引发错误。

DECLAREv_name VARCHAR2(20):='Accounting';v_deptno NUMBER := 27;
BEGINUPDATE departmentsSET department_name = v_nameWHERE department_id = v_deptno;
END;

当用户进入无效部门时会发生什么? 

编写的代码不会产生Oracle错误。 需要定义一个预定义的用户错误来引发错误。 

可以这样做:

1.在声明部分声明用户定义的异常的名称。

e_invalid_department EXCEPTION;

2.使用RAISE语句在可执行部分中明确地引发异常。

IF SQL%NOTFOUND THEN RAISE e_invalid_department;

3.在相应的异常处理例程中引用声明的异常。

EXCEPTIONWHEN e_invalid_department THENDBMS_OUTPUT.PUT_LINE('No such department id.');

以下是完整的代码。


1.在声明部分中声明用户定义的异常的名称。 语法:exception EXCEPTION; exception是异常的名称。

2.使用RAISE语句在可执行部分中显式引发异常。 语法:RAISE exception; 其中exception是先前声明的异常。

3.在相应的异常处理例程中引用已声明的异常。


三、RAISE声明

可以使用RAISE语句来引发一个指定的异常。 你可以提出:

•自己的异常(即用户定义的异常)

IF v_grand_total=0 THENRAISE e_invalid_total;
ELSE
DBMS_OUTPUT.PUT_LINE(v_num_students/v_grand_total);
END IF;

•Oracle服务器错误

IF v_grand_total=0 THENRAISE ZERO_DIVIDE;
ELSEDBMS_OUTPUT.PUT_LINE(v_num_students/v_grand_total);
END IF;


四、RAISE_APPLICATION_ERROR过程

    可以使用RAISE_APPLICATION_ERROR过程从存储的子程序返回用户定义的错误消息。

    使用RAISE_APPLICATION_ERROR而不是RAISE的主要优点是RAISE_APPLICATION_ERROR允许您将自己的错误号和有意义的消息与异常关联。

错误编号必须介于-20000和-20999之间。

(1)语法:

RAISE_APPLICATION_ERROR (error_number, message[, {TRUE | FALSE}]);
•error_number是-20000和-20999之间的异常的用户指定编号
•消息是异常的用户指定消息。 它是一个长达2048字节的字符串。

•TRUE | FALSE是一个可选的布尔参数。 

(如果为TRUE,则将错误放置在之前错误的堆栈上。如果FALSE-默认 - 错误将替换以前的所有错误。)

数字范围-20000到-20999由Oracle保留供程序员使用,并且从不用于预定义的Oracle Server错误。

(2)可以在两个不同的地方使用RAISE_APPLICATION_ERROR:
•可执行部分
•异常部分

(3)可执行部分中的RAISE_APPLICATION_ERROR
被调用时,RAISE_APPLICATION_ERROR过程向用户显示错误号和消息。 此过程与其他Oracle服务器错误一致。

DECLAREv_mgr PLS_INTEGER := 123;
BEGINDELETE FROM employeesWHERE manager_id = v_mgr;IF SQL%NOTFOUND THENRAISE_APPLICATION_ERROR(-20202, 'This is not a valid manager');END IF;
END;

(4)异常部分中的RAISE_APPLICATION_ERROR

DECLAREv_mgr PLS_INTEGER := 27;v_employee_id employees.employee_id%TYPE;
BEGINSELECT employee_id into v_employee_idFROM employeesWHERE manager_id = v_mgr;DBMS_OUTPUT.PUT_LINE('The employee who works for  manager_id '||v_mgr||' is: '||v_employee_id);
EXCEPTIONWHEN NO_DATA_FOUND THENRAISE_APPLICATION_ERROR (-20201, 'This manager has no employees');WHEN TOO_MANY_ROWS THENRAISE_APPLICATION_ERROR (-20202,'Too many employees were found.');
END;

(5)将RAISE_APPLICATION_ERROR与用户定义的异常一起使用

DECLAREe_name EXCEPTION;PRAGMA EXCEPTION_INIT (e_name, -20999);v_last_name employees.last_name%TYPE := 'Silly Name';
BEGINDELETE FROM employees WHERE last_name = v_last_name;IF SQL%ROWCOUNT =0 THENRAISE_APPLICATION_ERROR(-20999,'Invalid last name');ELSEDBMS_OUTPUT.PUT_LINE(v_last_name||' deleted');END IF;
EXCEPTION WHEN e_name THENDBMS_OUTPUT.PUT_LINE ('Valid last names are: ');FOR c1 IN (SELECT DISTINCT last_name FROM employees)LOOPDBMS_OUTPUT.PUT_LINE(c1.last_name);END LOOP;WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Error deleting from employees');
END;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以太坊地址和公钥_以太坊交易签名解析源码解读

上篇文章《以太坊交易签名过程源码解析[1]》从源码角度分析了一个合约调用的的签名过程,签名后的交易发送到以太坊节点后,节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址),进而将交易放入交易池中。本文从go-ethereum源码的出发…

IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡

在前两篇文章中,我们已经讲述如何配置与安装ARR,从本篇文章开始,我们将重点的来讲述如何在使用ARR进行负载均衡。 本篇文章的目的主要是一步步的带领大家如何配置和使用ARR来进行Http请求的负载均衡,从而实现高可用与高扩展性。同…

Oracle入门(十四.17)之procedure传递参数

一、PROCEDURE 参数模式参数模式在形式参数声明中指定,位于参数名称之后,位于其数据类型之前。 参数传递模式: •IN参数(默认值)为子程序提供处理值。 •OUT参数将值返回给调用者。•IN OUT参数提供一个输入值&#xf…

1.elasticsearch文档存储(保存|修改|删除)

【README】 0.本文部分内容(数据)总结自 es 开发文档, Document APIs | Elasticsearch Guide [7.2] | Elastic ; 1.本文的es版本是7.2.1; 2.elasticsearch 是一个数据存储,检索和分析引擎;本…

db9针232接口波特率标准_理解串口通信以及232,485,422常见问题

下面先讲一讲串口通信的一些基本概念,术语。如果对串口通信比较熟悉的,就当复习复习,如果哪里讲错或不到位,也可以及时指出,当作一块交流交流。这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲。因…

理解 .NET Platform Standard

.NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md .NET Platform Standard 是什么?直译过来就是 .NET 平台规范或标准,它的目的就是使 .NET 各个平台之间更加统一…

Oracle入门(十四.18)之使用动态SQL

一、SQL的执行流程数据库中的所有SQL语句都经历了不同的阶段: •解析:预执行“这可能吗?”检查包括语法,对象存在,权限等 •绑定:获取语句中引用的任何变量的实际值 •执行:语句被执行。•提取&…

天平游码读数例题_初二上册物理实验——托盘天平使用的注意事项

今天给大家讲讲托盘天平的使用和注意事项。(1)首先,我们回忆一下什么是托盘天平如下图托盘天平由底座、横梁、分度盘、托盘、平衡螺母、标尺、游码、托盘等组成,当然还有砝码。托盘天平是称量物体的质量的工具(质量符号m,单位:国际…

3.elasticsearch文档查询dsl

【README】 1.本文elasticsearch版本是 7.2.1; 2.文档查询语句叫做 DSL, domain structure language, 领域特定语言;dsl,参见 Query DSL | Elasticsearch Guide [7.2] | Elastic 3.elasticsearch 基于json 提供了完…

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作:UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

Oracle入门(十四.20)之创建DML触发器:第一部分

一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFORE,AFTE…

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…