IBM DB2 V9 存储过程异常捕获

------------------------------------------------------------
--脚本说明:测试存储过程异常捕获
--作者:彭建军
--DB2 VERSION : IBM UDB V 9.1
--OS : Windows XP Professional SP2
--最新文档更新时间:2006-8-11 14:13
------------------------------------------------------------


说明:存储过程在执行过程中,不可避免一些出错的情况出现,无论是DBMS本身出错,还是数据的出错都可能引发存储过程调用失败。捕获出错的原因,无疑对增强存储过程的健壮性是有益的。

测试步骤:

Step1:创建测试表 TestTable (见测试表建表脚本)
Step2:创建测试存储过程 TestProc (见存储过程脚本)
Step3:编译存储过程
Step4:插入测试数据,注意插入的数据要使存储过程出错
Step5:执行存储过程 (见测试捕获存储过程错误脚本)

脚本文件附后.


------------------------------------------------------------
--测试表建表脚本
------------------------------------------------------------

--业务表
DROP TABLE TestTable;
CREATE TABLE TestTable
(
  T_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
       (START WITH 0, INCREMENT BY 1, NO CACHE ),
  T_HalfYear VARCHAR(12) NOT NULL,--格式形如 '2006年上半年'
  T_Year SMALLINT,
  PRIMARY KEY (T_ID)
);

--存储过程出错日志记录表
DROP TABLE TestLog;
CREATE TABLE TestLog
(
  T_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
       (START WITH 0, INCREMENT BY 1, NO CACHE ),
  T_Message VARCHAR(100) NOT NULL,--记录存储过程出错信息
  PRIMARY KEY (T_ID)
);

------------------------------------------------------------
--存储过程脚本
------------------------------------------------------------

------------------------------------------------------------
--功能: 捕获存储过程异常测试
--作者: 彭建军
--最新更新时间: 2006-8-11 11:16
--编译存储过程 CLP "db2 -td@ -vf TestProc.db2"
--运行存储过程 CLP "db2 call TestProc"
------------------------------------------------------------
--删除该存储过程
DROP PROCEDURE TestProc()@

--创建该存储过程
CREATE PROCEDURE TestProc()
LANGUAGE SQL
BEGIN

  --变量定义 
  DECLARE sqlcode INTEGER DEFAULT 0;
  DECLARE sqlstate CHAR(5);
  DECLARE v_Message CHAR(100);
 
  --SQL异常处理,插入到错误日志表中
  DECLARE exit handler FOR sqlexception
  BEGIN

    --开始异常处理
    VALUES ('存储过程 TestProc 调用失败,SQLCode:' || CHAR(sqlcode) || 'SQLState:' || CHAR(sqlstate))
      INTO v_Message;

    INSERT INTO TestLog(T_Message)
      VALUES (v_Message);

    --显式提交事务
    COMMIT;

    --设置存储过程返回值
    SIGNAL SQLSTATE '99999'
    SET MESSAGE_TEXT = 'TestProc throw error';
  END;

  --开始实现业务逻辑
  UPDATE TestTable
    SET T_Year = INTEGER(SUBSTR(T_HalfYear,1,4));

END@

------------------------------------------------------------
--测试捕获存储过程错误脚本
------------------------------------------------------------

--插入正常的数据,观察存储过程执行情况
INSERT INTO TestTable (T_HalfYear)
  VALUES ('2006年上半年');

--执行存储过程
CALL TestProc;
------------------------------------------------------------
--CLP
CALL TestProc

  返回状态 = 0

SQLCODE: 0
------------------------------------------------------------

--查询业务表
SELECT * FROM TestTable;
------------------------------------------------------------
T_ID  T_HalfYear    T_Year
0     2006年上半年  2006
------------------------------------------------------------


--插入脏数据,观察存储过程执行情况
INSERT INTO TestTable (T_HalfYear)
  VALUES ('200年上半年');

--执行存储过程
CALL TestProc;
------------------------------------------------------------
--CLP
CALL TestProc
SQL0438N  应用程序发生错误,诊断文本:"TestProc throw error"。

SQLSTATE=99999

SQL0438N  应用程序发生错误,诊断文本:"TestProc throw error"
------------------------------------------------------------

--查询业务表
SELECT * FROM TestTable;
------------------------------------------------------------
T_ID  T_HalfYear    T_Year
0     2006年上半年  2006
1     200年上半年
------------------------------------------------------------

--查询存储过程错误日志表
SELECT * FROM TestLog;
------------------------------------------------------------
T_ID  T_Message
0     存储过程 TestProc 调用失败,SQLCode:-420 SQLState:22018                                     
------------------------------------------------------------

------------------------------------------------------------
--删除测试环境

------------------------------------------------------------

DROP TABLE TestTable;
DROP TABLE TestLog;
DROP PROCEDURE TestProc;


编后:关于 DB2 存储过程错误捕获还有很多实用的功能,限于篇幅,未收录入本文,争取下次收录补完。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值