设为首页 收藏本站
查看: 1368|回复: 0

[经验分享] DB2存储过程的异常处理

[复制链接]

尚未签到

发表于 2016-11-18 08:48:28 | 显示全部楼层 |阅读模式
    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&#8230;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中不支持异常处理。   
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301908-1-1.html 上篇帖子: DB2 数据库安全总述 下篇帖子: oracle和DB2的差异
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表