Oracle 异常处理

摘要:
对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。在相应的异常处理例程中引用错误的标准名来截获一个Oracle服务器预定义错误。语法:exceptionEXCEPTION;其中:exception异常名2.使用PRAGMAEXCEPTION_INIT语句将异常处理名字和Oracle的错误代码关联起来.语法:PRAGMAEXCEPTION_INIT;其中:exception先前声明的异常名error_number标准Oracle错误代码3.在相应的异常处理例程中引用已声明的异常。在PL/SQL块中,一个编译指令EXCEPTION_INIT告诉编译器将一个异常处理的名字和一个Oracle错误代码联系起来。
1、什么是异常
PL/SQL中的一个警告或错误的情形都可被称为异常。包括编译时错误(PLS)和运行时错误(ORA)。一个异常通常包含一个错误代码和错误文本,分别指示异常的编号和具体错误信息。
异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。
2、异常的分类

1.预定义(Predefined)错误

ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

2.非预定义(Predefined)错误

即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

3.用户定义(User_define)错误

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

3、异常的结构

EXCEPTION  
  WHEN exception1 [OR exception2 . . .] THEN
    statement1;  
    statement2;  
    . . .  
  [WHEN exception3 [OR exception4 . . .] THEN
    statement1;  
    statement2;  
    . . .]  
  [WHEN OTHERS THEN  
    statement1;  
    statement2;  
    . . .] 
--在异常部分WHEN 子句没有数量限制
--WHEN OTHERS 是最后一个子句
--异常处理部分从关键字EXCEPTION开始
--当异常抛出后,控制无条件转到异常处理部分
--在离开块之前只能执行一种异常处理

4、异常类型

4.1 预定义异常

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

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

Oracle 异常处理第1张

DECLARE
  test varchar(10);
BEGIN
  SELECT DNAME INTO test FROM DEPT WHERE DEPTNO='11';
  DBMS_OUTPUT.PUT_LINE(test);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('没有找到符合条件的数据');
  WHEN TOO_MANY_ROWS THEN
  DBMS_OUTPUT.PUT_LINE('返回的数据行过多');
  WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('EORROR:'||SQLCODE||'-'||SQLERRM);
END;

4.2 非预定义异常

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 INTOemp    
        SELECT * FROMemp;  
EXCEPTION  
    WHEN e_emp_cons   THEN
       dbms_output.put_line('违反唯一性约束');  
END; 

4.3 自定义异常

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

使用RAISE语句显式地发布

DECLARE
  name varchar(10);
  ex EXCEPTION;   --定义异常ex
BEGIN
  SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';
  DBMS_OUTPUT.PUT_LINE(name);
  IF NAME<>'HR' THEN
  RAISE ex;        --触发异常
  END IF;
EXCEPTION
  WHEN ex THEN
  DBMS_OUTPUT.PUT_LINE('10号部门不是HR');  --处理异常
END;

4、异常的传递

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

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

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

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

免责声明:文章转载自《Oracle 异常处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇span 换行4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Remoting异常处理:在客户端获取服务器内部错误

Remoting异常处理:在客户端获取服务器内部错误 (转载于http://blog.csdn.net/oneiter/article/details/1616369) 用Remoting技术进行开发有些日子了,其中有个问题一直困扰着我,那就是有关在客户端获取服务器内部错误的问题。当服务器和客户端部署在同一台机器上时,服务器端的错误能够在客户端成功地捕获...

Oracle的dual

1.dual 确实是一张表.是一张只有一个字段,一行记录的表(虚拟表). 2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:select * from mytable ;select * from myview;等等. 4.dual 是由 sql.bsq 建立的。每个data...

学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典

目录 1、服务器架构 1.1 系统全局区SGA 1.1.1 高速数据缓冲区(database buffer cache) 1.1.2 重做日志缓冲区(redo log buffer cache) 1.1.3 共享池(shared pool) 1.1.4 大型池(large pool) 1.1.5 Java池 1.1.6 流池 1.2 程序全局...

Oracle redo与undo浅析

http://liwenshui322.iteye.com/blog/1488949 一. 什么是redo(用于前滚数据) redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件。这两类重做日志文件都用于恢复;其主要目的是,万一实例失败或介质失败,...

精讲RestTemplate第7篇-自定义请求失败异常处理

本文是精讲RestTemplate第7篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换 精讲RestTemplate第3篇-GET请求使用方法详解 精讲RestTemplate第4篇-POST请求方法使用详解 精讲Res...

基于VMWare构架Oracle RAC集群数据库

一直以来曙光公司服务器在数据库领域遇到最大的竞争对手就是国外公司的小型机,它们经常会利用小型机本身就具有的逻辑分区技术来吸引用户,同时打击竞争对手。而VMware公司的企业级虚拟化产品VMware Infrastructure则完全能实现IBM、SUN等小型机逻辑分区的相等功能,所以曙光公司完全可以采用VMware Infrastructure产品+Ora...