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 服务器预定义错误。

DECLARE
  test varchar(10);
BEGIN
  SELECT DNAME INTO test FROM DEPT WHERE DEPTNO='';
  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 INTO emp
SELECT * FROM emp;
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='';
  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 异常处理的更多相关文章

  1. Oracle 异常处理汇总

    Oracle 异常处理汇总 1.plsql无法连接 安装oracle,中间录入密码,用户是:sys,pass: 录入的密码. 连接数据库,建议创建新的用户,最好别直接用sys 安装完毕,则需要配置Ne ...

  2. Oracle异常处理——ORA-01502:索引或这类索引的分区处于不可用状态

    Oracle异常处理--ORA-01502:索引或这类索引的分区处于不可用状态参考自:https://www.cnblogs.com/lijiaman/p/9277149.html 1.原因分析经过查 ...

  3. oracle异常处理——ORA-01000:超出打开游标最大数

    oracle异常处理--ORA-01000:超出打开游标最大数https://www.cnblogs.com/zhaosj/p/4309352.htmlhttps://blog.csdn.net/u0 ...

  4. ORACLE异常处理及函数

    有三种类型的异常错误 :预定义 ( Predefined )错误 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. 非预定义 ( Pred ...

  5. Oracle异常处理内容,隐式游标

    异常处理 create or replace procedure pr_test3(v_bh in varchar2,v_xx out t_hq_ryxx%rowtype) is begin sele ...

  6. Oracle异常处理,动态游标

    小例子,方便以后查阅. 包头需要声明:   type C_CURSOR is ref cursor; procedure visitcount(in_date number, out_code out ...

  7. Oracle数据库---异常处理

    Oracle异常处理在PL/SQL语句书写时,需要处理的异常-- 不做异常处理时DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE;BEGIN SELE ...

  8. .Net程序员学用Oracle系列(27):PLSQL 之游标、异常和事务

    1.游标 1.1.游标属性 1.2.隐式游标 1.3.游标处理及案例 2.异常 2.1.异常类别 2.2.异常函数 2.3.异常处理及案例 3.事务 3.1.开始事务.结束事务 3.2.自治事务 3. ...

  9. oracle 在存储过程或函数中得到异常sql

    BEGIN SQLSTR := 'UPDATE TBL ...'; EXECUTE IMMEDIATE SQLSTR; EXCEPTION WHEN OTHERS INSERT INTO LOG_TA ...

随机推荐

  1. 一个网站的head和body是如何进行优化的

    我们知道任何一个网站都要被解析成html后,浏览器才能识别,换句话说,用任何一门技术做的网站,都是被浏览器解析成为html.因此我们必须懂得,一个html页面由三部分组成,那就是html的开始标签和结 ...

  2. Exchange之三合一部署

          1.         前期准备条件之安装filter包   2.         前期准备之安装组件,命令如下 Add-WindowsFeature NET-Framework,RSAT- ...

  3. OSPF_Network-type

    OSPF的网络类型 目录 OSPF的网络类型... 1 总实验拓扑如下... 2 Router模拟帧中继交换机(所有网路为星型)... 2 配置映射... 3 广播模式下的OSPF. 4 非广播模式下 ...

  4. 桌面虚拟化之XenDesktop7

    安装篇 1. 安装所需要的组件 2. 安装核心组件 配置篇 完整的部署 1. 打开Citrix Studio软件 2. 选择完整部署 3. 创建站点 4. 选择数据库(可以使用自己的或者默认使用自带的 ...

  5. Apache windows多线程设置

    # WinNT MPM # ThreadsPerChild: constant number of worker threads in the server process # MaxRequests ...

  6. Cocos2d-JS中的精灵菜单和图片菜单

    精灵菜单的菜单项类是cc.MenuItemSprite,图片菜单的菜单项类是cc.MenuItemImage.由于cc.MenuItemImage继承于cc.MenuItemSprite,所以图片菜单 ...

  7. dateset是不是在缓存中

    C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...

  8. python常错: join() 方法

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 sequence -- 要连接的 ...

  9. 什么是GPX

    GPX(GPS eXchange Format, GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式. 它可以用来描述路点.轨迹.路程.这个格式是免费的,可以在不需要付任何许可费用的 ...

  10. AndroidStudio中gradle异常:unexpected end of block data

    原因:可能是Android buildTools版本不够高. 解决方法:打开build.gradle,将android中buildToolsVersion改为'20.0.0' (我使用的是gradle ...