------------------------------------------------------------
--脚本说明:测试存储过程异常捕获
--作者:彭建军
--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;

IBM DB2 V9 存储过程异常捕获相关推荐

  1. ORACLE 存储过程异常捕获并抛出

    ORACLE 存储过程异常捕获并抛出 参考文章: (1)ORACLE 存储过程异常捕获并抛出 (2)https://www.cnblogs.com/wdw31210/p/7009731.html 备忘 ...

  2. oracle异常抛出,ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

  3. Redhat Linux 5.3环境实施DB2 V9.7 HADR

    数据库主机:使用VMware workstation 虚拟两台机器 操作系统:Red Hat EL 5.3 数据库软件:DB2 V9.7 虚拟机,操作系统环境安装过程省去. 2.2逻辑拓扑结构 2.3 ...

  4. 在 AIX 操作系统上如何安装 IBM DB2 9版本的分区环境

    DB2 的分区环境适合于统计类和分析的应用,如一般单位的数据仓库系统,在数据仓库系统部署过程中,分区环境的安装往往是项目部署的第一步,在 DB2 的信息中心中有类似于安装方面的资料介绍,但资料比较分散 ...

  5. 使用IBM InfoSphere Guardium监视和审计IBM DB2 for i数据库活动

    总览 InfoSphere Guardium是企业信息数据库审核和保护解决方案,可帮助企业跨各种关系和非关系数据源(例如Oracle,Teradata,IMS,VSAM,Microsoft Share ...

  6. db2 v9.7 tablespace_state -“表空间状态”监视器元素 0x0400

    转载自:https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_9.7.0/com.ibm.db2.luw.admin.mon.doc/doc/r0 ...

  7. DB2数据库认证系列教程——IBM DB2认证考前必备

    DB2数据库认证系列教程--IBM DB2认证考前必备 IBM DB2认证 IBM DB2 认证是求职的敲门砖,也是很多 DB2 爱好者热衷追求的目标.本专题收集整理了IBM DB 2数据库认证相关的 ...

  8. IBM DB2基础知识学习作业

    IBM db2与oracle一样都是后台大型数据库,在我国许多银行的后台服务器都是db2. db2的PENDING状态 backup pending状态:是在修改数据库的日志模式所导致的:解决方法是对 ...

  9. Spring Boot配置全局异常捕获

    1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板 ExceptionController.java模拟测试用 MyAjaxExceptionHandler.j ...

最新文章

  1. 文本分类step by step(二)
  2. 16个免费和开源商业智能工具
  3. sysbench的安装详解
  4. 查询数据去除后面无用的0_Python数据分析与实战
  5. WWW 2020 开源论文 | 异构图Transformer
  6. 10_css控制背景与css精灵.txt
  7. Java 14:有用的NullPointerException消息
  8. 在一台机器上运行多个ActiveMQ实例
  9. Qt3转Qt5(Ui部分)
  10. matlab 鼠标自定义选中图像的任意区域
  11. SAP License:GR与IR
  12. C# - 接口,继承
  13. Nginx 在 Linux 下安装与搭建 Tomcat 集群
  14. VS2017 Visual Assist X破解方法
  15. freeradius mysql web_CentOS7部署FreeRadius3.0及WEB管理界面DaloRadius
  16. 《大数据之路-阿里巴巴大数据实践》第三章 数据同步
  17. 读《激荡三十年》有感
  18. mysql的cnf配置文件全解析
  19. Chrome 浏览器安装扩展程序
  20. 随机梯度下降(SGD)与经典的梯度下降法的区别

热门文章

  1. c语言常考易错知识点,C语言中易错点知识点拾遗
  2. 2020的一篇鸡鸣狗盗的远程桌面配置文档
  3. MOCO----Momentum Contrast
  4. 一般来说人工智能技术包括哪些
  5. linux下播放wma格式,智能手机什么软件能用播放wma格式的音乐
  6. 江南Style是怎么把youtobe的计数器弄坏的
  7. 教学记事:用提问的方式解疑
  8. 响应式网格(栅格化)布局总结
  9. luogu P6566 [NOI Online #3 入门组]观星
  10. python 中文编码类型 gb2312 gb180_常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、UTF-8、unicode...