zoukankan      html  css  js  c++  java
  • DB2存储过程——异常处理

    存储过程异常的处理: 
    看代码之前我先用文字来讲述一下,不太对的地方请见谅
    当我们执行存储过程的时候,会出现异常,报错。这时候如果我们定义了异常处理器,存储过程是可以捕捉到异常并且执行我们定义的操作的,用begin end来声明,一个存储过程可以
    有多个异常处理器。而存储过程可以分几个类型:出错了继续执行,出错了停止执行,出错了回滚sql操作并且停止执行。另外,db2帮我们定制了异常集(也就像java中的exception)
    有一些报错的信息,比如不能为Null,没有表,这些。 而这些提示的错误信息又叫做sqldata,sqlcode 也就是出现异常db2抛出的两个信息。而如果我们要用这两个信息,比如
    把信息存入表中,要用变量来接收这两个信息(也就是给变量赋值),然后存变量
    举个小例子
        declare exit handler for sqlexception    声明一个出现sqlexception异常执行完处理就会退出的一个处理器
        begin                                    出现异常后的操作开始
            set i_code=sqlcode;                  变量接收异常信息
            set i_err_no=1;                      给i_err_no变量赋值
            call SP_PASSYS_ERRHANDLE(v_proc_name,i_code);    调用这个函数
            commit;                              提交事务
        end;                                     结束标志
    
    
    
     


    condition和handler都是一样的,都是异常处理器
     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操作。
    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED'; 
    DECLARE UNDO HANDLER FOR NOT FOUND; 
    
    

     清单1:异常处理器示例 (也就是我们自己去设置错误信息设置sqlcode或者sqlstate)

      如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下: 
    DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate' 
    清单2:定制异常处理器 (自定义异常处理器)
       处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。
      通常,会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。
        declare sqlcode   integer   default 0; 
      begin
        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;
    end ;

       清单3:出现异常的时候执行的语句开始点

    此图注解:<type>:定义处理器类型:出错继续执行;出错停止;回滚并停止

    <conditions>:异常集,db2给我们定义的异常信息在里面,也可以用我们自定义的,在文章上部分有提示

    <handler-action>CONTINUE点也就是出错异常处理器捕捉到后执行的语句

    清单4、讲了定制异常处理器和没有定制异常处理器db2的方法

    清单5、signal是干嘛的,不懂

  • 相关阅读:
    ExtAspNet下通过文档路径实现文档的下载
    ExtjS学习--------Ext.define定义类
    【C语言天天练(二三)】errno变量
    Linux 内核kobject 层次, kset, 和子系统
    Linux 内核释放函数和 kobject 类型
    Linux 内核引用计数的操作
    Linux 内核 kobject 初始化
    Linux 内核 嵌入的 kobjects
    Kobjects, Ksets 和 Subsystems
    Kobjects, Ksets 和 Subsystems
  • 原文地址:https://www.cnblogs.com/wy20110919/p/9047673.html
Copyright © 2011-2022 走看看