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中不支持异常处理。