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

     1、自定义异常     
      DECLARE <condition-name> CONDITION     
          FOR SQLSTATE <sqlstate-value>;   

      注: <sqlstate-value>可以从7-9或T-Z开头

     2、异常捕捉     
      DECLARE EXIT | CONTINUE | UNDO    
      HANDLER FOR 异常 | SQLSTATE <sqlstate-value>    

      BEGIN    
          GET DIAGNOSTICS EXCEPTION 1 SQLERRM = MESSAGE_TEXT;      -- 取得错误信息
          VALUES (SQLCODE, SQLSTATE, SQLERRM)    INTO <变量> , <变量>, <变量>;    

           -- 获取SQLCODE,SELSTATE,SQLERRM信息到变量中 
            
      END;    
      注:EXIT;只跳转出HANDLER定义所在的BEGIN 和 END的程序块  

          FOR 所捕捉的异常可以是:SQLEXCEPTION,SQLWARNING,NOT FOUND,自定义异常
      

     3、异常抛出     
      SIGNAL <condition-name>    抛出自定义异常或者是已经定义的异常
      SIGNAL SQLSTATE <VALUE> [SET MESSAGE_TEXT = <error-message>];    抛出异常,制定异常的SQLSTATE和异常信息
      RESIGNAL     用在异常句柄捕捉中,指把此异常抛到上一层。
      RESIGNAL 和 SIGNAL 之间的区别在于,SIGNAL是在非HANDLER处理逻辑中抛出异常,而RESIGNAL则是在HANDLER处理逻辑中抛出异常。语法一致。    

     4、注:PROCEDURE中能够定义和捕捉异常,FUNCTION中不支持异常处理。   

    转自:http://tech.ccidnet.com/art/982/20100818/2157363_1.html

    以下的文章主要向大家讲述的是DB2 存储过程的异常处理方法,在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异常,并且没有为这个异常定义异常处理器,那么DB2 存储过程就会失败,并且会将控制流返回调用者。

    以下示例声明了两个异常处理器。 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赋予本地变量或参数。

    通常,我们会为DB2 存储过程定义一个执行状态的输出参数(例如: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;

    较好的实例:

    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 存储过程异常处理方法的介绍,望你能有所收获。

    附另外一篇:

     1、自定义异常     
      DECLARE <condition-name> CONDITION     
          FOR SQLSTATE <sqlstate-value>;   

      注: <sqlstate-value>可以从7-9或T-Z开头

     2、异常捕捉     
      DECLARE EXIT | CONTINUE | UNDO    
      HANDLER FOR 异常 | SQLSTATE <sqlstate-value>    

      BEGIN    
          GET DIAGNOSTICS EXCEPTION 1 SQLERRM = MESSAGE_TEXT;      -- 取得错误信息
          VALUES (SQLCODE, SQLSTATE, SQLERRM)    INTO <变量> , <变量>, <变量>;    

           -- 获取SQLCODE,SELSTATE,SQLERRM信息到变量中 
            
      END;    
      注:EXIT;只跳转出HANDLER定义所在的BEGIN 和 END的程序块  

          FOR 所捕捉的异常可以是:SQLEXCEPTION,SQLWARNING,NOT FOUND,自定义异常
      

     3、异常抛出     
      SIGNAL <condition-name>    抛出自定义异常或者是已经定义的异常
      SIGNAL SQLSTATE <VALUE> [SET MESSAGE_TEXT = <error-message>];    抛出异常,制定异常的SQLSTATE和异常信息
      RESIGNAL     用在异常句柄捕捉中,指把此异常抛到上一层。
      RESIGNAL 和 SIGNAL 之间的区别在于,SIGNAL是在非HANDLER处理逻辑中抛出异常,而RESIGNAL则是在HANDLER处理逻辑中抛出异常。语法一致。    

     4、注:PROCEDURE中能够定义和捕捉异常,FUNCTION中不支持异常处理。   

     

  • 相关阅读:
    redis单机主从搭建
    zabbix监控rds
    zabbix_server表面启动成功,但是没有进程
    sysbench压测mysql
    使用gnuplot对tpcc-mysql压测结果生成图表
    tpcc-mysql的使用
    tpcc-mysql安装
    鼠标点击烟花爆炸效果
    css3背景自动变色代码
    js实现文本输入框的特效
  • 原文地址:https://www.cnblogs.com/millen/p/2220521.html
Copyright © 2011-2022 走看看