Oracle--plsql异常处理

什么是异常?
Oracle中出现错误的情形通常分为编译时错误(compile-timeerror)和运行时错误(run-time error),异常是在PL/SQL执行过程中出现的警告或错误。

异常是如何触发的?
发生了一个 Oracle 错误时
使用RAISE语句显式触发

如何处理异常?
用处理机截获
在调用环境中传播异常

两种触发异常方法:

发生了 Oracle 错误,就会自动触发相关的异常。

可以在块中使用RAISE语句显式的触发异常。被触发的异常可以是预定义的异常,也可以是自定义的异常。




截获异常

如果在块的执行部分异常被触发,当前的块就会转去执行异常处理部分的相应异常处理机。如果PL/SQL成功处理了异常,就不会把异常传播给外部块或环境,从而,PL/SQL块正常结束。

异常的传播

如果在块的执行部分异常被触发, 然而没有相应的异常处理机,块就会异常终止,而将异常传递给调用环境。

错误引发异常,每当引发异常时,都将控制权传递给异常处理程序,异常处理程序处理异常.


捕获异常:

EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]


在异常部分WHEN 子句没有数量限制
WHEN OTHERS 是最后一个子句
异常处理部分从关键字EXCEPTION开始
当异常抛出后,控制无条件转到异常处理部分
在离开块之前只能执行一种异常处理

预定义异常:

预定义异常是由 Oracle 为常见错误预先定义的,不需要显式声明。

在相应的异常处理例程中引用错误的标准名来截获一个Oracle 服务器预定义错误。


例子:

DECLARE v_sal emp.sal%type; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=999; EXCEPTION WHEN NO_DATA_FOUND then dbms_output.put_line('没有查到数据'); WHEN others then dbms_output.put_line('其它异常'); END;

要截获Oracle服务器没有预定义的错误,需先声明这个错误或者使用OTHERS处理机。 



非预定义异常:

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

    语法:

    exception      EXCEPTION;

    其中:  exception  异常名

2.  使用PRAGMAEXCEPTION_INIT语句将异常处理名字和Oracle的错误代码关联起来.

   语法:

   PRAGMA   EXCEPTION_INIT ( exception, error_number ) ;

    其中:  exception  先前声明的异常名

   error_number  标准Oracle 错误代码

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


关键字 PRAGMA (伪指令pseudoinstructions)表示语句是一个编译指令,在执行PL/SQL块时并不处理该语句。在PL/SQL块中,一个编译指令EXCEPTION_INIT告诉编译器将一个异常处理的名字和一个Oracle错误代码联系起来。

DECLARE e_emp_cons EXCEPTION; PRAGMA EXCEPTION_INIT(e_emp_cons,-00001); BEGIN INSERT INTO emp SELECT * FROM emp; EXCEPTION WHEN e_emp_cons THEN dbms_output.put_line('违反唯一性约束'); END;
捕获异常的函数:

SQLCODE

  返回Oracle的错误代码

SQLERRM

  返回和错误值相关联的信息

SQLCODE值  说明

  0      没有异常   

  100      NO_DATA_FOUND异常

  负数      其它Oracle错误号


自定义异常:

在PL/SQL块的声明部分声明。

使用RAISE语句显式地发布 。


异常的传递;

当子块自己处理异常时,它可以正常终止,并且在子块的END语句之后可以立即将控制交给外部块。

然而,如果 PL/SQL出现了异常,但当前块中没有针对该异常的处理机,就会寻找外部块中有没有处理机,如果所有的外部块都不能处理这个异常,则就会在宿主环境中出现未经处理的异常。

当把异常传播给外部块,则当前块中的等待执行代码都不再被执行。

这种方法的优点就是内部块仅处理自己特有的错误,而将一般的异常处理留给外部块。

Raise_Application_Error过程
用于创建用户定义的错误消息的过程
向用户返回错误,并且其返回格式和其它Oracle错误的格式相同
既可以在可执行部分中使用,也可以在异常部分中使用

  Raise_Application_Error(error_number,message);

错误编号必须介于 –20000 –20999 之间
错误消息的长度可长达 2048 个字节

利用过程 RAISE_APPLICATION_ERRO返回一个非标准的错误代码和错误消息,从而可以和预定义异常进行交互。使用RAISE_APPLICATION_ERROR就可以向应用程序报告错误消息,并且避免了返回没有处理过的异常。

执行区域: BEGIN … delete from emp where demtno=10; if SQL%NOTFOUND then Raise_Application_Error(-20202, ’this is not a valid department’); end if; … 异常区域: EXCEPTION when NO_DATA_FOUND then Raise_Application_Error(-20202, ’this is not a valid department’); END;


转载于:https://www.cnblogs.com/android-html5/archive/2012/03/29/2534075.html

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

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

相关文章

再谈SQL Server中日志的的作用

简介 之前我已经写了一个关于SQL Server日志的简单系列文章。本篇文章会进一步挖掘日志背后的一些概念,原理以及作用。如果您没有看过我之前的文章,请参阅: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事…

VS2012和XE2013的关联和设置问题

1. 首先要正确安装Microsoft VisualStudio 2012 Intel Parallel Studio XE 2013,其中,先安装VS2012,再安装XE2013。 2.Microsoft Visual Studio 2012 Intel Parallel Studio XE 2013集成检验: 打开:开始所有程序-&…

推荐一款移动端的web UI控件 -- mobiscroll

用mobiscroll 可实现ios系统自带的选择器控件效果,支持几乎所有的移动平台(iOS, Android, BlackBerry, Windows Phone 8, Amazon Kindle),当然在pc的浏览器上跑,效果也还不错。建议使用支持css3的浏览器访问^_^ 支持换肤,效果和性…

I2C通信 读写数据过程

在通信之初,主从机必须根据自己的要求约定好通信规则:command的定义和位置、address的位数和位置。 以读写从机寄存器数据为例: 假设从机寄存器地址为8位、从机寄存器也位8位(被读取数据为8位); 约定读comm…

C++的运算符重载(转)

C的运算符重载 cc扩展语言 C中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C中重新定义这些运算符,赋予已有运算符新的功能&#xff0c…

Android应用程序结构总结

2019独角兽企业重金招聘Python工程师标准>>> Android应用程序结构分析 由于是初学者,对于Android应用程序的结构的认识是一穷二白的,对于开发Android应用程序,必须先了解其程序的结构和作用。一下就用一个简单的例子来解剖&#…

递归--整数划分问题

问题描述: 将正整数n表示成一系列正整数之和:nn1n2…nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。 问题1: 输出整数n的所有可能的划分,如: 输入:6 输出&am…

webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

webrtc是google推出的基于浏览器的实时语音-视频通讯架构。其典型的应用场景为:浏览器之间端到端(p2p)实时视频对话,但由于网络环境的复杂性(比如:路由器/交换机/防火墙等),浏览器与浏览器很多时候无法建立p2p连接&…

从0-1背包问题学习回溯法、分支界限法、动态规划

一、0-1背包问题的描述 下面将使用回溯法、分支界限法、动态规划法来分析和解决此问题。 二、回溯法 (1)算法步骤 (2)代码如下(没有裁剪函数): 用i和n来判断结束与否,是因为解空间…

高可用性的HDFS—Hadoop分布式文件系统深度实践

《高可用性的HDFS—Hadoop分布式文件系统深度实践》基本信息作者: 文艾 王磊 出版社:清华大学出版社 ISBN:9787302282587上架时间:2012-5-14出版日期:2012 年5月开本:16开页码:371版次&#xff…

【作品】超级玛丽射击版

【下载地址】稍后上传 【以下内容摘自试验报告,可能狗屁不通,尽情谅解】 -游戏介绍: 简单的射击游戏,键盘控制动作[角色的移动,跳跃等],鼠标控制攻击的位置方向, 单击鼠标即射击,同时可以设置游戏规定时间,时间到则结束游戏. -游戏…

MySQL锁的用法之行级锁

2019独角兽企业重金招聘Python工程师标准>>> 行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突。但是粒度越小,实现的成本也越高。MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针…

matlab中二维插值函数interp2的使用

下面是一段产生log-normal分布的代码,以此进行说明。 clear all; clc; for t1:100Traffic(t) curve(t); end MaxTraffic max(Traffic); w 0.2; Wmax 2*pi*w/3000; x[0:10:300]; y[0:10:300]; Nxlength(x); Nylength(y); Sigma 0.53; t 0; M 10*cu…

8天玩转并行开发——第五天 同步机制(下)

承接上一篇,我们继续说下.net4.0中的同步机制,是的,当出现了并行计算的时候,轻量级别的同步机制应运而生,在信号量这一块 出现了一系列的轻量级,今天继续介绍下面的3个信号量 CountdownEvent,Se…

Quartz 2D编程笔记

当我们需要在一个图形上下文中构建一个路径时,我们需要调用CGContextBeginPath来标记Quartz。然后,我们调用函数CGContextMovePoint来设置每一个图形或子路径的起始点。在构建起始点后,我们可以添加直线、弧、曲线。记住如下规则:…

个人管理 - 书籍推荐(待读)

在《个人管理 - 书籍推荐(已读)》中推荐了一些书籍,有些人从中选取了一些,但其实还有很多好书我还没有读,为了给大家更多选择,我把我欠下的书债也贴上来。由于豆瓣还没有提供书列表的功能&#…

Node.js用6行代码1个JS文件搭建一个HTTP静态服务器

2019独角兽企业重金招聘Python工程师标准>>> Node.js宣言:Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes i…

ERROR: Start Page at 'www/index.html' was not found

用Xcode 4.3.2新建了一个PhoneGap的应用,www目录下存在index.html文件,但是运行的时候,报错:ERROR: Start Page at www/index.html was not found,这是PhoneGap和Xcode 4还不兼容导致的。 可以右键项目名->Add File…

Linux线程-互斥锁pthread_mutex_t

在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函…