• DB2存储过程标准


    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||'01','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||'10','YYYY-MM-DD')
                                                 ELSE TO_DATE(TMP_YEAR||TMP_MON||'20','YYYY-MM-DD') END
                                                 INTO PTD_DAY        FROM            SYSIBM.DUAL;                --旬初
    
    SELECT        CASE WHEN TMP_MON IN ('01','02','03') THEN TO_DATE(TMP_YEAR||'-01-01','YYYY-MM-DD') -1 DAY
                                                    WHEN TMP_MON IN ('04','05','06') THEN TO_DATE(TMP_YEAR||'-03-31','YYYY-MM-DD')
                                                    WHEN TMP_MON IN ('07','08','09') 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||'0229' THEN TO_DATE(TMP_YMD -10000,'YYYY-MM-DD') ELSE TO_DATE((TMP_YEAR-1)||'0228','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@
  • 相关阅读:
    pgsql批量新增覆盖原表数据
    乘风破浪,遇见最美Windows 11之新微软商店(Microsoft Store)生态 Wondershare HiPDF正式登陆Teams应用市场
    乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉掀起CTC技术浪潮,5大车企扎堆跟进,想要干掉电池组
    时光卷轴,IT启示录2022年6月刊
    乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 微软跨平台UI框架.NET MAUI,基于.NET 6构建的通用框架
    HTTP编码和解码与基本认证
    HTTPS&SPDY&HTTP2&QUIC&HTTP3
    HTTP报文结构
    HTTP内容协商机制和断点续传
    HTTP Web安全
  • 原文地址:https://www.cnblogs.com/Jims2016/p/6735891.html
Copyright © 2020-2023  润新知