CREATE OR REPLACE PROCEDURE "FCT"."PROC_FCT_DSB_SERIES"(IN ACCOUNTING_DATE DATE)
-------------------------------------------------------------------------------
LANGUAGE SQL
SPECIFIC PROC_FCT_DSB_SERIES
------------------------------------------------------------------------------
-- 功能描述:描述该存储过程的用处 处理流程 -- 输入:当前程序调用日期8位数(如20140101)
-- 源表:
-- 目标表:
-- 修改日志
-- 类型 作者 日期 备注
-- 创建 ------------------------------------------------------------------------------ BEGIN
/*声明异常处理使用变量*/
DECLARE SQLCODE, SMY_SQLCODE INT DEFAULT 0; --SQLCODE
DECLARE SMY_STEPNUM INT DEFAULT 1; --过程内部位置标记
DECLARE SMY_STEPDESC VARCHAR(100) DEFAULT ''; --过程内部位置描述
DECLARE SMY_DATE DATE; --临时日期变量
DECLARE SMY_RCOUNT INT; --DML语句作用记录数
DECLARE SMY_PROCNM VARCHAR(100); --存储过程名称
DECLARE AT_END SMALLINT DEFAULT 0; --SQL查询结果结束标志 /*声明存储过程使用变量*/
DECLARE CUR_YEAR SMALLINT; --年
DECLARE CUR_MONTH SMALLINT; --月
DECLARE CUR_DAY INTEGER; --日
DECLARE CLEAR_MONTH_DAY INTEGER; --清理数据日
DECLARE CLEAR_MONTH_DATE DATE; --清理数据日期
DECLARE YR_FIRST_DAY DATE; --本年初1月1日
DECLARE QTR_FIRST_DAY DATE; --本季度第1日
DECLARE MONTH_FIRST_DAY DATE; --本月第1日
DECLARE NEXT_YR_FIRST_DAY DATE; --下年1月1日
DECLARE NEXT_QTR_FIRST_DAY DATE; --下季度第1日
DECLARE NEXT_MONTH_FIRST_DAY DATE; --下月第1日
DECLARE MONTH_DAY SMALLINT; --本月天数
DECLARE YR_DAY SMALLINT; --本年天数
DECLARE QTR_DAY SMALLINT; --本季度天数 DECLARE TMP_YEAR CHAR(4) ; --年(YYYY)
DECLARE TMP_MON CHAR(2) ; --月(MM)
DECLARE TMP_YMD CHAR(8); --年月(YYYYMM)
DECLARE TMP_DAY CHAR(2) ; --日(DD)
DECLARE LST_TMP_YEAR CHAR(4) ; --上年(YYYY)
DECLARE PRE_LST_TMP_YEAR CHAR(4) ; --前年(YYYY)
DECLARE LST_TMP_MON CHAR(2) ; --上月(MM)
DECLARE MTH_DAY INT ; --月数(INTEGER)
DECLARE YEAR_DAY INT ; --年初到当前时间的天数(INTEGER)
DECLARE LAST_MTH_DAY INT ; --上月末到年初的天数(INTEGER)
DECLARE PD_DAY DATE; --上日
DECLARE PTD_DAY DATE; --旬初
DECLARE MI_DAY DATE; --月初
DECLARE QI_DAY DATE; --月初
DECLARE YI_DAY DATE; --月初
DECLARE CP_DAY DATE; --月初
DECLARE CP_YI_DAY DATE; --月初
DECLARE MTH SMALLINT; --月份数(INT)
DECLARE MAX_ACG_DT DATE; --最大会计日期
DECLARE DELETE_SQL1 VARCHAR(200); --删除HIS表动态SQL
DECLARE DELETE_SQL2 VARCHAR(200); --删除SMY表动态SQL /*1.定义针对SQL异常情况的句柄(EXIT方式).
2.将出现SQL异常时在存储过程中的位置(SMY_STEPNUM),位置描述(SMY_STEPDESC),SQLCODE(SMY_SQLCODE)记入表SMY_LOG中作调试用.
3.调用RESIGNAL重新引发异常,跳出存储过程执行体,对引发SQL异常之前存储过程体中所完成的操作进行回滚.*/
---------------------------异常处理---------------------------BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET at_end=1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET SMY_SQLCODE = SQLCODE;
ROLLBACK;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE, NULL, CURRENT TIMESTAMP);
COMMIT;
RESIGNAL;
END; DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
SET SMY_SQLCODE = SQLCODE;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE, NULL, CURRENT TIMESTAMP);
COMMIT;
END;
---------------------------异常处理---------------------------END /*初始化变量*/
SET TMP_YEAR = SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),1,4); --年
SET TMP_MON = SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),6,2); --月
SET TMP_YMD = TO_CHAR(ACCOUNTING_DATE,'YYYYMMDD'); --年月日
SET TMP_DAY = SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),9,2); --日
SELECT SUBSTR(TO_CHAR((ACCOUNTING_DATE - 1 YEAR),'YYYY-MM-DD'),1,4), SUBSTR(TO_CHAR((ACCOUNTING_DATE - 1 MONTHS),'YYYY-MM-DD'),6,2),SUBSTR(TO_CHAR((ACCOUNTING_DATE - 2 YEAR),'YYYY-MM-DD'),1,4)
INTO LST_TMP_YEAR,LST_TMP_MON ,PRE_LST_TMP_YEAR FROM SYSIBM.SYSDUMMY1;
SELECT INT(SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYYMMDD'),5,2)) INTO MTH_DAY FROM SYSIBM.SYSDUMMY1 ;
SELECT (DAYS(ACCOUNTING_DATE)-DAYS(TO_DATE(TMP_YEAR||'-01-01','YYYY-MM-DD'))+1) INTO YEAR_DAY FROM SYSIBM.SYSDUMMY1 ;
SELECT (DAYS(TO_DATE(TMP_YEAR||TMP_MON||'','YYYY-MM-DD'))-DAYS(TO_DATE(TMP_YEAR||'-01-01','YYYY-MM-DD'))) INTO LAST_MTH_DAY FROM SYSIBM.SYSDUMMY1 ; SET PD_DAY = ACCOUNTING_DATE - 1 DAY; --上日
SET MI_DAY = TO_DATE(SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),1,7)||'-01','YYYY-MM-DD') - 1 DAY; --月初
SELECT CASE WHEN SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),9,2)<=10 THEN MI_DAY
WHEN (SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),9,2)>10
AND SUBSTR(TO_CHAR(ACCOUNTING_DATE,'YYYY-MM-DD'),9,2)<=20) THEN TO_DATE(TMP_YEAR||TMP_MON||'','YYYY-MM-DD')
ELSE TO_DATE(TMP_YEAR||TMP_MON||'','YYYY-MM-DD') END
INTO PTD_DAY FROM SYSIBM.DUAL; --旬初 SELECT CASE WHEN TMP_MON IN ('','','') THEN TO_DATE(TMP_YEAR||'-01-01','YYYY-MM-DD') -1 DAY
WHEN TMP_MON IN ('','','') THEN TO_DATE(TMP_YEAR||'-03-31','YYYY-MM-DD')
WHEN TMP_MON IN ('','','') THEN TO_DATE(TMP_YEAR||'-06-30','YYYY-MM-DD')
ELSE TO_DATE(TMP_YEAR||'-09-30','YYYY-MM-DD') END INTO QI_DAY FROM SYSIBM.DUAL; --季初 SET YI_DAY = TO_DATE(LST_TMP_YEAR||'-12-31','YYYY-MM-DD'); --年初
SET CP_DAY = CASE WHEN TMP_YMD <> TMP_YEAR||'' THEN TO_DATE(TMP_YMD -10000,'YYYY-MM-DD') ELSE TO_DATE((TMP_YEAR-1)||'','YYYY-MM-DD') END; --同期
SET CP_YI_DAY = TO_DATE(PRE_LST_TMP_YEAR ||'-12-31','YYYY-MM-DD'); --同期年初
SELECT INT(SUBSTR(TMP_YMD,5,2)) INTO MTH FROM SYSIBM.DUAL;--月数(INT) SET SMY_PROCNM = 'PROC_FCT_DSB_SERIES';
SET SMY_DATE=ACCOUNTING_DATE;
SELECT MAX(LAST_ETL_ACG_DT) INTO MAX_ACG_DT FROM SMY.ORG_CST_SMY; SET DELETE_SQL1='ALTER TABLE HIS.ORG_CST_SMY ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE'; --清空HIS表
SET DELETE_SQL2='ALTER TABLE SMY.ORG_CST_SMY ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE'; --清空SMY表 /*Delete日志表,条件SMY_PROCNM=当前存储过程名字,SMY_DATE=ACCOUNTING_DATE,并插入新的起始标志*/
DELETE FROM SMY.SMY_LOG WHERE SMY_ACT_DT = SMY_DATE AND SMY_PROC_NM = SMY_PROCNM;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, 'PROCEDURE START.', SMY_SQLCODE, SMY_RCOUNT, CURRENT TIMESTAMP); /*存储过程Begin*/ /*Step.1 : 数据恢复与备份*/
SET SMY_STEPNUM = SMY_STEPNUM + 1 ;
SET SMY_STEPDESC = '数据恢复与备份'; IF MAX_ACG_DT=ACCOUNTING_DATE THEN
EXECUTE IMMEDIATE DELETE_SQL2;
COMMIT;
INSERT INTO SMY.ORG_CST_SMY SELECT * FROM HIS.ORG_CST_SMY;
COMMIT;
GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP);
ELSE
EXECUTE IMMEDIATE DELETE_SQL1;
COMMIT;
INSERT INTO HIS.ORG_CST_SMY SELECT * FROM SMY.ORG_CST_SMY;
COMMIT;
GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP);
END IF; GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP);
COMMIT; /*Step.2 : 删除目标表数据*/
SET SMY_STEPNUM = SMY_STEPNUM + 1 ;
SET SMY_STEPDESC = '删除目标表数据'; DELETE FROM FCT.FCT_DSB_SERIES WHERE DAY_ID = ACCOUNTING_DATE ; GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP);
COMMIT; /*Step.3 : update最后更新日期*/
SET SMY_STEPNUM = SMY_STEPNUM + 1 ;
SET SMY_STEPDESC = 'update最后更新日期'; UPDATE FCT.FCT_DSB_SERIES SET LAST_ETL_ACG_DT = ACCOUNTING_DATE; GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;--
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP); /*Step.4 : 标记存储过程结束*/
SET SMY_STEPNUM = SMY_STEPNUM + 1 ;
SET SMY_STEPDESC = '存储过程结束!'; GET DIAGNOSTICS SMY_RCOUNT = ROW_COUNT;--
INSERT INTO SMY.SMY_LOG VALUES(SMY_PROCNM, SMY_DATE, SMY_STEPNUM, SMY_STEPDESC, SMY_SQLCODE ,SMY_RCOUNT, CURRENT TIMESTAMP); COMMIT;
END@

DB2存储过程标准的更多相关文章

  1. DB2 存储过程创建、系统表

    前段时间做了数据表拆分,进行数据迁移,用到一些SQL命令,语句记录下来 db2look是DB2用于生成数据库DDL语句的一个工具: 命令:db2look -d DBname -a -e -p -i u ...

  2. db2存储过程

    一. 使用存储过程的好处 1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间 应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起, 从而使得对于每一组S ...

  3. DB2存储过程语法规则

    如何声明一个存储过程CREATE PROCEDURE 存储过程名(IN 输入变量名 输入变量类型,OUT 输出变量名 输出变量类型)紧跟其后的是存储过程属性列表            常用的有:LAN ...

  4. linux命令行执行db2存储过程

    存储过程代码如下: CREATE PROCEDURE proc_sum2(IN n INT,OUT sum INT,OUT j INT) BEGIN DECLARE i INT; ; ; ; WHIL ...

  5. db2 存储过程迁移方法

    大家在迁移数据库时,存储过程一般也要迁移过去,但一般有两个问题: 1. 非常多存储过程有先后关系(存储过程调用存储过程),假设存储过程数量少,还能手动操作.假设量大,那真是要疯了. 2. 存储过程过大 ...

  6. 通过DbVisualizer 工具运行DB2存储过程实现INSERT语句主键自增造数

    1.需求简介 最近开发人员需要进行一批数据进行生产上SQL语句耗时过长问题的验证与优化.所以在性能测试库中批量建造数据,由于交易本身业务逻辑过于复杂以及需要各种授权,最后决定采用插表的方式完成. 2. ...

  7. db2存储过程动态sql被截断

    编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql ...

  8. db2存储过程迁移

    一.导出存储过程 EXPORT TO D:/PROCUDURE/procudure.del OF del MODIFIED BY LOBSINFILE SELECT 'SET CURRENT SCHE ...

  9. db2 存储过程参数传递--字段类型转换产生的问题

    修改之前的脚本 select count(*) from dbdk.dtdkg010 A left join DBDK.DTDKG070 D ON D.PAY_NO = A.PAY_NO LEFT J ...

随机推荐

  1. 开发环境入门 linux基础 基本操作命令(部分) 文本结构和基本命令

    文本结构和基本命令 linux系统中系统提示符:$ 表示普通用户 su  root切换用户命令(用户名 root),输入密码,切换到其他用户状态 root 命令提示符:# exit 退出当前用户,返回 ...

  2. angular使用代理解决跨域

    angular2.angular4.angular5 及以上版本的跨域问题. 通过angular自身的代理转发功能 配置package.json 两种方式启动代理服务 第一种: 启动项目通过npm s ...

  3. DAY4-函数进阶

    目录: 一.迭代器 二.生成器 三.面向过程编程 四.三元表达式.列表推导式.生成器表达式 五.第归与二分法 六.匿名函数 七.内置函数 练习 一.迭代器 一.迭代的概念 #迭代器即迭代的工具,那什么 ...

  4. python中注释的书写

    与c和c++的//不同的是,在python中我们使用#来进行注释 每个#所在的那一行都可以叫做注释:

  5. oracle --(一)数据块(data Block)

    基本关系:数据库---表空间---数据段---分区---数据块 数据块(data Block)一.数据块Block是Oracle存储数据信息的最小单位.这里说的是Oracle环境下的最小单位.Orac ...

  6. powerdesigner自动将name填充到注释的脚本

    我在建模的时候,希望在生成脚本的时候有注释,所以才会看到Comment列,实际上,只要你的表中的Name列不为空,运行下面的VBScript,PD会帮你自动填充注释的Comment列值. '把pd中那 ...

  7. Java界面设计

    ---------------siwuxie095                             Java SE(Java Standard Edition) 即 Java 标准版, 一般也 ...

  8. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  9. noi.ac day6t3 color

    传送门 分析 将询问离线,枚举右端点.新加入一个右端点i时,假设离i第t近的同色位置为p,t+1近的是q,则当i是右端点时,(q,p]的点可以作为左端点. 注意对于一个点离它第t近的同色点可以用队列维 ...

  10. noi.ac day1t3 Sort

    传送门 分析 快排的原理是以任意一个数为标准,然后把所有小于它的数换到它的左边,所有大于它的数换到它的右边.我们就使用快排的思路,分治整个区间.对于每个区间以排好序的这个数列的中间位置的值为标准,然后 ...