•什么是异常?
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

Oracle--plsql异常处理相关推荐

  1. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  2. oracle中plsql块的结构,oracle plsql的结构

    变量声明部分(没有变量可以不写declare) begin 执行部分 exception 异常处理部分 end *:declare 和 exception部分是可选的 (1)PL/sql中变量的定义 ...

  3. mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序

    Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 declare cu ...

  4. lower() oracle,PLSQL LOWER用法及代码示例

    PLSQL LOWER函数用于将指定字符串中的所有字母都转换为小写.如果字符串中的字符不是字母,则不受此功能的影响. 要转换的char可以是任何数据类型,例如CHAR,VARCHAR2,NCHAR,N ...

  5. Oracle 存储过程异常处理

    Oracle 存储过程异常处理 参考文章: (1)Oracle 存储过程异常处理 (2)https://www.cnblogs.com/colder/p/5737107.html (3)https:/ ...

  6. Oracle PLSQL 导出数据table xx contains one or more CLOB columns 解决方案

    Oracle PLSQL 导出数据table xx contains one or more CLOB columns 解决方案 参考文章: (1)Oracle PLSQL 导出数据table xx ...

  7. oracle sum函数返回类型,Oracle / PLSQL SUM函数

    这个Oracle教程解释了如何使用Oracle / PLSQL SUM函数. SUM(x) 添加x中的所有值,并返回总和. SUM函数对一组行进行操作,并返回一行输出. Null值被SUM函数忽略.您 ...

  8. oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...

    Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link) 有没有办法只通过数据库链接而不是当前会话的数据提交在表上插入/更新的 ...

  9. Oracle/PLSQL Repeat Until Loop

    Oracle/PLSQL: Repeat Until Loop Oracle doesn't have a Repeat Until loop, but you can emulate one. Th ...

  10. Oracle/PLSQL Case Statement

    Oracle/PLSQL: Case Statement In Oracle 9i, you can use the case statement within an SQL statement. I ...

最新文章

  1. 家校通Android源码,基于Android的家校通系统设计与实现
  2. Oracle RAC 环境下的连接管理
  3. mysql训练逻辑的题_全国计算机等级考试二级教程mysql复习题练习题.docx
  4. java hashmap object_Java中的大量Object(使用HashMap)
  5. SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)
  6. html meta页面自适应,【转载·收藏】 html5手机网站自适应需要加的meta标签
  7. java api限流_Java 9:流API的增强
  8. Java程序员如何快速理解Kubernetes
  9. Linux多线程开发-线程同步-互斥锁pthread_mutex_t
  10. 最近在ST公司的STxp70的dsp平台上开发音频codec模块.
  11. python如何统计累计每日的人数‘’_每日一练 | Data Scientist amp; Business Analyst amp; Leetcode 面试题 902...
  12. Navicat连接本地数据库报错问题解决方案
  13. 图像检索:CEDD(Color and Edge Directivity Descriptor)算法
  14. 融合多源信息的知识表示学习方法
  15. 大数据核心技术有哪些 怎么样学好大数据开发
  16. 火狐浏览器,错误代码:SEC_ERROR_REUSED_ISSUER_AND_SERIAL
  17. luogu P2198 杀蚂蚁
  18. NOIP提高组初赛[选择题知识点汇总]
  19. 许远东:砥砺互联网,有人是先锋,有人是炮灰
  20. 从电影《流浪地球》中学项目管理

热门文章

  1. linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...
  2. javaweb jsp页面无法解析${message}
  3. android nougat和安卓7.1,Android Nougat 7.1.2 先睹为快
  4. leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦
  5. C++(STL):21---deque之源码剖析
  6. 大数据学习(5)-- NoSQL数据库
  7. 深度学习(莫烦 神经网络 lecture 3) Keras
  8. linux 虚函数调用性能,C++对象布局及多态实现探索之虚函数调用
  9. 如何查询oracle最近报警信息,教你怎样用Oracle方便地查看报警日志错误
  10. vsftp不允许切换到其它目录_IntelliJ IDEA如何对project的目录进行筛选显示?