日期:2014-05-16 浏览次数:20735 次
--接文:《仓库拉链算法的数据恢复机制(重跑中间任意一天保证数据的准确完整性) 》;参考博文地址:http://blog.csdn.net/nsj820/article/details/6096682
本文是在《仓库拉链算法的数据恢复机制(重跑中间任意一天保证数据的准确完整性) 》基础上,对仓库拉链算法的进一步思考;描述了历史拉链表个别数据需要重跑的解决方案。
思考:原文曾说还未考虑用此种方法进行增量数据的拉链处理,现在思考了一下这并不具有可行性;其实此文中所述可以理解为增量处理方式的一种,可以按此文再作些扩充;但因增量源数据传输而产生的拉链断链问题并不能很好的解决,除非设定断链数据跟其前一非空链值相同;但这理解和解释起来好像又不是很通。
1、存储过程P_T100_STATUS_H_one_update代码
create or replace procedure P_T100_STATUS_H_one_update( P_ETLDATE in VARCHAR2, --日期参数 P_KEY in VARCHAR2, --主键数据 O_RUNSTATUS out NUMBER, --执行结果 O_MSG out VARCHAR2) --错误返回 is --定义存储过程信息 V_PROC_NAME VARCHAR2(50) := 'P_T100_STATUS_H'; V_TABLE_NAME VARCHAR2(50) := 'EDW_T100_STATUS_H'; V_START_TIMESTAMP TIMESTAMP; --加载开始时间 V_END_TIMESTAMP TIMESTAMP; --加载结束时间 V_RECORD_NUMBER INTEGER; --记录数 V_KEY VARCHAR2(100) := P_KEY; --定义错误代码,错误状态 V_SQLERRM VARCHAR2(1000); --异常信息 V_ERR_SQL VARCHAR2(1000); --出错位置 BEGIN --捕获过程开始时间 SELECT SYSDATE INTO V_START_TIMESTAMP FROM DUAL; /***************************************************************************************************/ /****************** 数据分链处理 **********************/ /***************************************************************************************************/ --1、处理目标中结束日期为P_ETLDATE和开始日期为P_ETLDATE+1的数据 --(1)、转移目标表中结束日期为P_ETLDATE的数据到TMP_T100_STATUS_H_PRE之前表中 V_ERR_SQL:='转移目标表中结束日期为P_ETLDATE的数据到之前表中'; INSERT INTO TMP_T100_STATUS_H_PRE (Id --ID ,Status --状态 ,Start_Date --开始日期 ,End_Date --结束日期 ) SELECT Id ,Status ,Start_Date ,End_Date FROM EDW_T100_STATUS_H WHERE End_Date = TO_DATE(P_ETLDATE,'YYYY-MM-DD') --结束日期为当天的数据 AND id = V_KEY; --(2)、转移目标表中开始日期为P_ETLDATE+1的数据到TMP_T100_STATUS_H_LAT之后表中 V_ERR_SQL:='转移目标表中开始日期为P_ETLDATE+1的数据到之后表中'; INSERT INTO TMP_T100_STATUS_H_LAT (Id --ID ,Status --状态 ,Start_Date --开始日期 ,End_Date --结束日期 ) SELECT Id ,Status ,Start_Date ,End_Date FROM EDW_T100_STATUS_H WHERE Start_Date = TO_DATE(P_ETLDATE,'YYYY-MM-DD')+1 --开始日期为N+1天的数据 AND id = V_KEY; --2、处理目标表中开始日期与结束日期跨越P_ETLDATE和P_ETLDATE+1的数据(分两部分:一部分转移到之前表;一部分转移到之后表) --(1)、转移到之前表的跨度数据 V_ERR_SQL:='转移到之前表的跨度数据'; INSERT INTO TMP_T100_STATUS_H_PRE (Id --ID ,Status --状态 ,Start_Date --开始日期 ,End_Date --结束日期 ) SELECT Id ,Status ,Start_Date ,TO_DATE(P_ETLDATE,'YYYY-MM-DD') FROM EDW_T100_STATUS_H WHERE Start_Date < TO_DATE(P_ETLDATE,'YYYY-MM-DD') AND End_date >= TO_DATE(P_ETLDATE,'YYYY-MM-DD')+1 --当天日期介于开始日期与结束日期之间的数据 AND id = V_KEY; --(2)、转移到之后表的跨度数据 V_ERR_SQL:='转移到之后表的跨度数据'; INSERT INTO TMP_T100_STATUS_H_LAT (Id --ID ,Status --状态 ,Start_Date --开始日期 ,End_Date --结束日期 ) SELECT Id ,Status ,TO_DATE(P_ETLDATE,'YYYY-MM-DD') + 1 Start_Date ,End_Date FROM EDW_T100_STATUS_H WHERE Start_Date <= TO_DATE(P_ETLDATE,'YYYY-MM-DD') AND End_date > TO_DATE(P_ETLDATE,'YYYY-MM-DD')+1 --当天日期介于开始日期与结束日期之间的数据 AND id = V_KEY; --3、删除目标表中以上4步已经转移了的数据及要被第4步更新的当日数据 V_ERR_SQL:='删除目标表中以上4步已经转移了的数据及要被第4步更新的当日数据'; DELETE FROM EDW_T100_STATUS_H WHERE Start_Date <