本站不再更新,欢迎光临 java开发技术网
随笔-230  评论-230  文章-8  trackbacks-0

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;

 

关于异常的我想这么多够用了,异常这一节还有其它的一些内容。

posted on 2006-09-19 18:09 有猫相伴的日子 阅读(6745) 评论(2)  编辑  收藏 所属分类: pl/sql

评论:
# re: pl/sql异常学习笔记 2008-08-17 14:43 | elmentkaka
xuexi  回复  更多评论
  
# re: pl/sql异常学习笔记[未登录] 2009-03-23 18:05 |
太感谢了!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
本站不再更新,欢迎光临 java开发技术网