`
kb5706
  • 浏览: 41520 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

PL/SQL的异常处理

 
阅读更多

  原文转自:http://oracle.chinaitlab.com/PLSQL/797300.html


在 PL / SQL 中错误信息处理过程分为两步: 引发错误和处理错误。编译处误是由 PL/SQL 编译器产生的,它们应该在执行程序前解决。

  PL/SQL 异常:类型与定义

  处理异常有 3 个基本的步骤:

  1、 声明异常(显式或隐式地声明)

  2、 引发异常(显式或隐式地引发)

  3、 处理异常(如果需要处理的话)

  PL/SQL 异常都具有以下几个基本特征

  错误类型:这界定了错误是 ORA 错误或 PLS 错误

  错误代码:一串表示错误代码的数字

  错误文本:错误信息的文本,包括错误代码

  PL/SQL 的内置错误

  下面列出了在异常处理中使用的声明 / 语句:

  EXCEPTION 声明 : 在声明用户定义的异常时,必须使用这种说明

  RAISE 语句:引发异常时必须使用的指令

  PRAGMA EXCEPTION_INIT 指令:把 Oracle 错误与用户自定义异常关联时使用这种指令。

  SAVE EXCEPTION 子句: 这是 oracle 9i 中新增加的一个内容,主要用于批绑定处理中,如果有一执行失败,则处理会继续进行而不会停止。

  函 数

  可以使用下面两个函数捕获在 PL/SQL 中发生的 Oracle 错误信息

  SQLCODE :该函数返回怀疑有错误的错误代码

  SQLERRM :该函数返回怀疑有错误的错误文本

  过程

  可以使用下面过程的 PL/SQL 中定义用户错误消息。

  RAISE_APPLICATION_ERROR :可以使用这个过程来定义用户错误消息和在使用该过程的位置上暂停程序的执行。

  异常处理程序

  虽然 pl/sql 代码块中异常处理部分是不可缺少的,但是它对于任何 pl/sql 程序来说却都是必要的。强烈推荐在每一个 pl/sql 程序中编写异常处理代码

  异常处理程序是由 EXCEPTION WHEN…… 子句定义的。下面是其语法

  

EXCEPTION  WHEN  exception_name THEN
  …..

  也可以指定多个异常,如下所示:

  

EXCEPTION
  WHEN exception_nam1 THEN
  …….
  WHEN exception_nam2  THEN
  ……
  WHEN OTHERS THEN
  ….

  当 ORACLE 错误发生的时候,如果有个紧接着它的异常处理程序,控制就会立即转移到该异常处理程序中;如果没有,控制权就转移到下一个可用的异常处理程序中; 果没有任何异常,程序就会以一个未处理异常形式终止。

  PL/SQL 异常类型

  Pl/sql 中异常基本上可以分为以下几类

  1、 预定义异常

  2、 未定义的 Oracle 异常

  3、 用户自定义异常

  4、 用户自定义的 PL/SQL 错误信息

  处理 PL/SQL 异常

  有两种处理异常的方法:

  1、 处理异常以后程序继续执行

  2、 处理异常以后程序停止执行

  发生异常时,如果程序需要继续执行,则需要执行一下以个步骤:

  1、 显式或隐式地引发异常

  2、 对已经引发的异常, ….

  3、 异常处理程序的代码执行以后,程序执行就会相应的恢复或终止

  4、 如果在整个程序中都没定义异常处理程序,程序就会在引发异常的位置终止,引发异常的执行点之后代码就得不到执行。

  

  

  

create or replace procedure
  p1 is
  v_temp varchar2( 200 );
  begin
  select  al_name into v_temp from addr_alias where al_id= 'aaa3' ;
  dbms_output.put_line( 'sfsafdsafasdfdfsa' );
  end ;

  在以上代码中,执行 select 语句是出现异常,不执行 dbms_output 语句

  

create or replace procedure
  p1 is
  v_temp varchar2( 200 );
  begin
  select  al_name into v_temp from addr_alias where al_id= 'aaa3' ;
  dbms_output.put_line( 'sfsafdsafasdfdfsa' );
  EXCEPTION  when NO_DATA_FOUND then
  dbms_output.put_line(sqlerrm);
  end ;

  以上代码加了了异常处理,执行时输出 :

  ORA-01403: no data found

  异常信息,说明在程序在 select 出现异常就跳转到异常处理处,执行异常处理程序,但并没有执行 dbms_output.put_line(‘afasfads’); 语句输出信息,异常出现 — 》处理 异常 — 》结束运行。

  

create or replace procedure
  p1 is
  v_temp varchar2( 200 );
  begin
  select  al_name into v_temp from addr_alias where al_id= '123456789' ;
  dbms_output.put_line( 'sfsafdsafasdfdfsa' );
  EXCEPTION
  when NO_DATA_FOUND then
  dbms_output.put_line(sqlerrm);
  whenothersthen
  dbms_output.put_line( 'others exception--->' ||sqlerrm);
  end ;

  以上代码执行输出结果是 :

  ORA-01403: no data found

  和上一个代子一样,这例子说明在多个异常体里,只有一个异常被执行了。

  以上例子都是程序运行时出现异常,而停止运行。

  处理异常后继续执行

create or replace procedure p2

  is

  v_temp varchar2( 200 );

  begin

  begin

  select  al_name into v_temp from addr_alias where al_id= '123456789' ;

  dbms_output.put_line( 'ssssskkddd' );

  exception  when no_data_found then

  select  al_name into v_temp from addr_alias where al_id= '3' ;

  dbms_output.put_line( 'v_temp-->' ||v_temp|| '  sqlerrm-->' ||sqlerrm);

  end ;

  begin

  dbms_output.put_line( ' 第二 begin end;' );

  exception

  when   no_data_found then

  dbms_output.put_line( 'aaaaaaa' );

  end;

 exception

  whenothersthen

  dbms_output.put_line( ' 最外层 exception...' );

  end;

以上程序中运行时输出的结果如下:

  v_temp--> 龙口 .. sqlerrm-->ORA-01403: no data found

  第二层 begin end;

  结果说明在第一个 begin end; 执行时发了异常,就执到行该层的 exception 来处理异常,异常处理完后执行第二个 begin end; 的代码,当你把第一层 begin end; 中的异常 处理部分注释掉后,输出的结果如下 :

  最外层 exception...

  这结果说明了,在第一个 begin end; 中因为没有异常处理模块,所以程序跳到上一层寻找异常处模块来处理异常,同第一个 begin end; 同一个层次的第二个 begin end; 模 块的代码就不会执行,如果在最外层也找不到异常处理模块就执行默认的异常处理模块。

  处理用户自定义异常

  用户自定义异常,像其它 pl/sql 一亲友,显式地声明用户自定义异常。可以使用 EXCEPTION 关键字指定这些异常的数据类型。其语法如下 :

  1 、定义自定义异常

  Exception_name EXCEPTION;

  注意:必须用 EXCEPTION 关键字定义用户自定义异常

  用户自定义异常不与任何错误代码或错误文本关联

  2 、使用 RAISE 语句引发用户自定义异常

  Raise exception_name;

  例子 :

Declare

  Examp_exception  EXCEPTION;

  Begin

  If  ( 条件 )  then

  Raise examp_exception;

  End if;

  Exception

  When examp_exception then

  ……

  End;

处理声明和异常处理部分引发的异常

  1、 在声明部分引发的异常

  在声明部分引发的异常必须在其紧接着的封闭块( begin ..end )中的相关处理程序中进行处理。如果紧接着的封闭块中不存在该处理程序,控制就会转到有该处理程序的 第一个封闭块。

  如

Declare

  V_num number(2) :=100

  Begin

  Null;

  ..

  Exception

  when value_error then

  null;

  when others then

  null;

  End;

  这样的定义是不能正确处理掉声时所产生的异常。为此必须定义一个封闭块来处理该封闭块的声明部分引发的异常,代码如下 :

Declare

  V_num number(2) :=100

  Begin

  Null;

  ..

  Exception

  when value_error then

  null;

  when others then

  null;

  End;

  Exception

  when value_error then

  dbms_output.put_line(‘value error occurred’);

  when others then

  dbms_output.put_line(‘…’);

  End;

这样才能正确的处理声明时的异常

  2、 处理异常部分引发的异常

  只能在异常模块的内部引发 (raise) 外部异常。如:

Declare

  Excep1 exception;

  Excep2 exception;

  Begin

  Begin

  If  ( 条件 )   then

  Raise excep1;

  End if;

  Exception

  When excep1 then

  Raise excep2;

  End;

  Exception

  When excep2 then

  Null;

  When others then

  Dbms_output.put_line(‘………..’);

  End;

以上就是关于异常处理的总结,主要的是用户自定义异常这部分比较实用,附上开发规范中的一个例子,备查:

begin

  select   nvl(bill_id,' ') ,nvl(currency_code,' ')

  into v_receive_id,v_currency_code

  from ar_receivable where ship_no = PI_ship_no;

  exception

  when no_data_found  then --没有找到满足条件记录进行变量的赋值

  v_currency_code := ‘ ‘;            --执行相应的语句

  when dup_val_on_index then      --插入键值重复

  plsql_statements;             --执行相应的语句

  when invalid_number then      --将字符串转换成数据变量期间出错

  plsql_statements  ;

  when too_many_rows then    --返回多个记录到变量中时,出现错误

  plsql_statements;

  when others then              --其他的情况应该如何进行处理

  plsql_statements;

  end;






分享到:
评论

相关推荐

    有关于ORACLE PL/SQL异常处理的3个知识点!

    ORACLE PL/SQL异常处理.有关于异常处理的3个知识点!

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程和函数、触发器等。 PL/SQL 的优点包括: * ...

    PL/SQL 程序设计

    PL/SQL 程序设计 本章主要重点:  PL/SQL概述  PL/SQL块结构  PL/SQL流程  运算符和表达式  游标  异常处理  数据库存储过程和函数  包  触发器

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序...

    Oracle PL/SQL语言初级教程

    文档目录内容如下: Oracle PL/SQL语言初级教程 1 目录 1 1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 ...9.PL/SQL异常处理初步 88 异常传播 91 常用异常处理方法 93

    PL/SQL Developer 6.05注册版-1

    <br>PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    第6章 异常处理 118 第3部分 pl/sql数据 第7章 使用数据 159 第8章 字符串 182 第9章 数字 221 第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型...

    PL/SQL Developer v8.0.zip

    PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模...

    PL/SQL课件

    异常处理(第8~10章) 游标(第11~12章) 触发器(第13~14章) 复合数据类型(第15~16章) 动态SQL(第17章) 批量SQL(第18章) 子程序和包(第19~22章) Oracle中对象类型(第23章) Oracle提供的包(第24章)

    PL/SQL Developer 7.1.5 注册版-3

    <br>PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了...

    Oracle_PLSQL语言基础

    与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:  声明部分(Declaration section)  声明部分包含了变量和常量的数据类型和初始值。这个...

    PL/SQL程序设计

    异常处理 数据库存储过程和函数 包 触发器 §1.2 SQL与PL/SQL §1.2.1 什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写。ORACLE的SQL是支持ANSI(American national Standards ...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件 ...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

     第16章异常处理 . 第17章本地动态SQL  第18章PL/SQL过程  第19章PL/SQL函数  第20章PL/SQL包  第21章触发器  第22章使用对象类型 第四部分PL/SQL系统包  第23章使用大对象  第24章读写OS文件  第25章开发...

    PL/SQL Developer

     PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模...

    Oracle PL/SQL语言入门

    PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(用declare开头)、执行部分(以 begin开头)和异常处理部分(以exception开头)。其中执行部分是必须的,其他两个部分可选。无论PL/SQL...

    pl/sql developer 9 + 注册机

     该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模工作团队的协作。 ...

    ORACLE 异常处理总结.doc

    Oracle 异常处理。即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该能够正确处理各种...当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前。

Global site tag (gtag.js) - Google Analytics