db2 存储过程异常处理

声明:本文作者 weiruan85
        在 db2中,如果要使用sqlcode那么必须在DDL语句之前declare。 

        存储过程异常的处理: 
        DECLARE handler-type HANDLER FOR condition handler-action
  
        异常处理器类型(handler-type)有以下几种:
  CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
  EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
  UNDO 在处理器操作执行之前, DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
  异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:
  NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
  SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
  SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
  如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。
  以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
 
     清单3:异常处理器示例
  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';
  DECLARE UNDO HANDLER FOR NOT FOUND;
  如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:
  
        清单4:定制异常处理器
  DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
  处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。
  通常,我们会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。


     declare sqlcode   integer   default 0;
    begin
      declare continue handler for sqlexception set ret = sqlcode;
      declare continue handler for sqlwarning set ret = sqlcode;
      declare continue handler for not found set ret = sqlcode;
    end ; --异常的声明

--异常的处理
if sqlcode< 0 or sqlcode= 100 then     
    set O_RetCod = RetCode;
set O_RetMsg = 'CLN02:产品实例关联客户过程出错!';
insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)
values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);
return;
else
    set RetCode = 0;
end if;
         异常高级处理: http://www-900.ibm.com/cn/support/nav/200504/p4-1.shtml
      较好的实例:
CREATE PROCEDURE divide  IN numerator INTEGER ,
                             
IN denominator INTEGER ,
                            
OUT result INTEGER )
 
LANGUAGE SQL
  BEGIN
 
DECLARE  overflow CONDITION  FOR  SQLSTATE  '22003' ;

 DECLARE CONTINUE  HANDLER  FOR  overflow
RESIGNAL SQLSTATE 
'22375' ;
IF  denominator  0 THEN
SIGNAL overflow
;
ELSE
 
SET result  numerator  denominator ;
END  IF;

你可能感兴趣的:(存储过程,db2,职场,异常,休闲)