在
				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 
有猫相伴的日子 阅读(6789) 
评论(2)  编辑  收藏  所属分类: 
pl/sql