PLSQL学习(三) 异常处理
						
				
		
		
				
						
						
				 
		
				
						    任何一种编程语言中的异常处理部分都是比较重要的一部分,单独学习一下。
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
								一、异常的种类及基本用法:
						
				
		
		
				
						
						
				 
		
				
						
								1、预定义异常(总计21种,具体见文档)
						
				
		
		
				
						
						
				 
		
				
						    使用方法:
				
		
		
				
						
								
										    BEGIN
								
										
										
										
								
						
						
								
										      
								
								SELECT
								...
						
						
								
										      
								
								SELECT
								...
						
						
								
										      
								
								SELECT
								...
						
						
								
										  
										    ...
						
						
								
										    EXCEPTION
								
										  
										
										
								
						
						
								
										    WHEN
								NO_DATA_FOUND 
								THEN
								...
								
										
										
								
						
				
		 
		
				
						
						 
				
						
								
										    常用类型:
						
				
				
						
								
										
												
														    NO_DATA_FOUND       
												
														--ORA-01403--
												
												
														
																未找到行
														
														
																
																
														
												
										
										
												
														    TOO_MANY_ROWS       
												
														--ORA-01422--SELECT INTO
												
												
														
																语句返回多行数据
														
														
																
																
														
												
										
										
												
														    VALUE_ERROR         
												
														--ORA-06502--
												
												
														
																类型转换错误
														
														
																
																
														
												
										
										
												
														    ZERO_DIVIDE         
												
														--ORA-01476--
												
												
														
																程序尝试除以
														
														
																0
														
														
																
																
														
												
										
										
												
														 STORAGE_ERROR       
												
														--ORA-06500--PL/SQL
												
												
														
																运行时内存溢出或内存不足
														
														
																
																		
																		
																
														
												
										
										
										
								
						
				 
				
						
						 
				
						
								
										
												
														
																2、非预定义异常(EXCEPTION_INIT
																)
														
												
										
								
								
										
												
														
																
																
														
												
										 
								
										
												
														
																    方法一:
														
												
										
								
								
										
												
														
																    需要在declare中申明,申明后使用即与预定义异常相同
														
												
										
								
								
										
												
														
														
												
										
										
												
														
																
																		
																				    declare
																				
																						
																						
																				
																		
																
														
												
										
								
								
										
												
														      e_deptno_remaining 
										exception
										;
								
								
										
												
														      
										
										PRAGMA
										
										
										EXCEPTION_INIT
										(e_deptno_remaining, -
										2292
										);
								
								
										
												    begin
								
								
										
										
										
												    ...
								
								
										
												
														
																    exception
														
																
																
														
												
										
								
								
										
												    when
										e_deptno_remaining
										then
										
												
												
										
								
								
										
												    dbms_output.put_line(
										'
										
												非预定义2292
												'
												);
										
								
								
										
												    when
										
										
										others
										
										
										then
										
												
												
										
								
								
										
												    dbms_output.put_line(
										'others'
										);
								
								
										
												    end
										;
										
												
												
										
								
								
										
										
								
						
				 
		  
-2292必须是oracle自定义的错误号,前面加负号
如果需要自己设定,则必须在-20000——-20999之间
此方法无法定义异常信息。
 
    方法二:
    错误号与错误信息均可自己定义
    且无需在declare和exception中声明
    declare
      i int := 5;
    begin
     if i=5then
     raise_application_error (-20086/*-20000——-20999*/, '自定义错误信息');
     endif;
    end;
 
3、自定义异常(分为declare、raise、exception三部分)
 
    使用示例:
    declare
      i int := 3;
      ex exception;
    begin
      if i <=2then
      raise ex;
      else dbms_output.put_line(i);                              
      endif;
    exception
      when ex then
      dbms_output.put_line('xxx');
    end;
 
 
二、注意使用Others的异常类:
 
    在EXCEPTION中定义任何的异常后
    尽量都使用when others
    表示遭遇到除此之外的任何异常如何处理
 
    EXCEPTION
      WHEN exception_name1 THEN   -- handler
        sequence_of_statements1
      WHEN exception_name2 THEN   -- another handler
        sequence_of_statements2
        ...
      WHENOTHERSTHEN            -- optional handler
        sequence_of_statements3
    END;  
 
    另外,在EXCEPTION中可以使用OR链接    WHEN over_limit OR under_limit OR VALUE_ERROR THEN
 
 
三、使用系统错误号和错误信息
 
    错误号----SQLCODE;
    错误信息--SQLERRM;
    DECLARE
      err_num   NUMBER;
      err_msg   VARCHAR2(100);
    BEGIN
      ...
    EXCEPTION
      WHENOTHERSTHEN
        err_num    := SQLCODE;
        err_msg    := SUBSTR(SQLERRM, 1, 100);
        dbms_output.put_line(err_num || '---' || err_msg);
    END;
  
 
四、异常传播的规则
  
    首先,异常是会向他的外层进行传递的
    即如果在当前子块中未定义异常处理,则会传递到外层的异常处理
    直到异常被捕获或最终被抛弃
 
    注:声明中的异常必定无法被当前块捕获
    DECLARE
    Abc number(3):='abc';
    ...
    BEGIN
    ...
    EXCEPTION
    WHENOTHERSTHEN
    ...
    END;----即便使用others最终也无法捕获