Oracle入门(十四.15)之捕获Oracle服务器异常

一、异常类型

本课讨论预定义和非预定义的Oracle服务器异常。


(1)使用PL / SQL处理异常

有两种提出异常的方法:
•Oracle服务器隐式(自动):

- 发生Oracle错误并自动引发相关异常。

- 例如,如果在SELECT语句中没有从数据库中检索行时发生错误ORA-01403,则PL / SQL引发异常NO_DATA_FOUND。

•程序员明确指出:

- 根据您的程序正在执行的业务功能,您可能必须明确提出异常。

- 通过在块内发出RAISE语句显式引发异常。

- 引发的异常可以是用户定义的或预定义的。 这些在下一课中解释。

(2)两种类型的Oracle服务器错误

    当发生Oracle服务器错误时,Oracle服务器会自动引发关联的异常,跳过块的可执行部分的其余部分,并在异常部分查找处理程序。

有两种类型的Oracle服务器错误:
•预定义的Oracle服务器错误:

- 每个错误都有一个预定义的名称。

- 例如,如果在SELECT语句中没有从数据库中检索到行时发生错误ORA-01403,则PL / SQL会引发预定义的异常名称NO_DATA_FOUND。

•非预定义的Oracle服务器错误:

- 这些错误中的每一个都有一个标准的Oracle错误编号(ORA-nnnnn)和错误消息,但不是预定义的名称。

- 为这些名称声明自己的名称,以便可以在异常部分中引用这些名称。

(3)捕获预定义的Oracle服务器错误

在异常处理例程中引用预定义的名称。
•预定义例外示例:

- NO_DATA_FOUND

- TOO_MANY_ROWS

- INVALID_CURSOR

- ZERO_DIVIDE

- DUP_VAL_ON_INDEX

有关预定义例外的部分列表,请参阅第0部分中的学生资源中提供的简短列表。

有关预定义例外的完整列表,请参阅PL / SQL用户指南和参考。

以下示例使用TOO_MANY_ROWS预定义的Oracle服务器错误。 请注意,它未在声明部分中声明。

DECLAREv_lname VARCHAR2(15);
BEGINSELECT last_name INTO v_lnameFROM employees WHERE job_id = 'ST_CLERK';DBMS_OUTPUT.PUT_LINE('The last name of the ST_CLERK is: '||v_lname);
EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE (' Your select statement retrieved multiple
rows. Consider using a cursor.');
END;

此示例处理TOO_MANY_ROWS和NO_DATA_FOUND,并在出现任何其他错误时使用OTHERS处理程序。

DECLAREv_lname VARCHAR2(15);
BEGINSELECT last_name INTO v_lnameFROM employees WHERE job_id = 'ST_CLERK';DBMS_OUTPUT.PUT_LINE('The last name of the ST_CLERK is: '||v_lname);
EXCEPTION
WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE ('Select statement found multiple rows');WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE ('Select statement found no rows');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE ('Another type of error occurred');
END;

捕获非预定义的Oracle服务器错误非预定义的例外与预定义的例外类似; 但是,它们在PL / SQL中没有预定义的名称。 它们是标准的Oracle服务器错误,并具有ORA错误编号。

可以在DECLARE部分为他们创建自己的名称,并使用PRAGMA EXCEPTION_INIT函数将这些名称与ORA-错误号相关联。


•可以通过首先声明它来捕获非预定义的Oracle服务器错误。 声明的异常是隐含提出的。 在PL / SQL中,PRAGMA EXCEPTION_INIT指示编译器将异常名称与Oracle错误号关联。
•这允许通过名称引用任何Oracle Server异常并为其编写特定的处理程序。


二、非预定义错误

检查以下示例。

BEGIN
INSERT INTO departments(department_id, department_name) VALUES (280, NULL);
END;
ORA-01400: cannot insert NULL into (“USVA_TEST_SQL01_S01”.“DEPARTMENTS”. “DEPARTMENT_NAME”)

INSERT语句尝试插入department表的department_name列的值NULL。但是,操作不成功,因为department_name是NOT NULL列。 没有违反NOT NULL约束的预定义错误名称。解决此问题的方法是声明您自己的名称并将其与ORA-01400错误关联。

1.在声明部分声明异常的名称。


2.使用PRAGMA EXCEPTION_INIT函数将声明的异常与标准Oracle服务器错误号相关联。


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



三、捕获异常的函数

发生异常时,可以使用两个函数检索相关的错误代码或错误消息。
根据代码或消息的值,您可以决定采取哪些后续操作。
•SQLERRM返回包含与错误编号关联的消息的字符数据。

•SQLCODE返回错误代码的数字值。 (您可以将其分配给NUMBER变量。)


不能在SQL语句中直接使用SQLCODE或SQLERRM。 相反,您必须将它们的值分配给本地变量,然后使用SQL语句中的变量,如以下示例中所示:

DECLAREv_error_code NUMBER;v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTIONWHEN OTHERS THENROLLBACK;v_error_code := SQLCODE ;v_error_message := SQLERRM ;INSERT INTO error_log(e_user,e_date,error_code,error_message)
VALUES(USER,SYSDATE,v_error_code,v_error_message);
END;





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

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

相关文章

萤石云好友分享的监控怎么看_萤石S1:英超赛场上雄起的中国品牌

北京时间4月26日20:30,英超2014/15赛季第34轮,曼联客场0比3不敌埃弗顿,麦卡锡、斯通斯和米拉拉斯先后进球。曼联在连败的情况下积分榜跌至第四。后弗格森时代的曼联最近刚刚有点起色,似乎这场惨败又让曼联球迷的信心跌到了低谷。在…

2.es与mongodb的区别

【1】es vs mongo 图片转自: MongoDB和Elasticsearch的对比 参考文档: MongoDB和Elasticsearch的对比 10亿数据,数据库选Mongo还是Elalsticsearch?-51CTO.COM ElasticSearch可以替代Mongo么? - 知乎 https://www.j…

taro 缺点_Taro小程序富文本解析4种方法

最近遇到一个富文本解析的问题,尝试了很多办法,终于成功了!最后本人选择Parser。1.Taro组件rich-text优点:使用极其方便,引用一下就行了。缺点:不支持视频,放弃!2.wxParse https://g…

IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm

自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问题是一些比较基本的问题,由于时间的缘故,不会一一的为大家回复,如果有不明白的,希望大家勤…

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

一、异常类型 本文讨论用户定义的错误。二、捕获用户定义的异常 PL / SQL允许你定义你自己的异常。 您根据应用程序的要求定义异常。输入数据期间需要用户定义的异常的一个示例。 假设您的程序提示用户输入部门编号和名称,以便它可以更新部门的名称。 当用户进入无效…

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

上篇文章《以太坊交易签名过程源码解析[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妙…