取最新的数据:V_DATA_DATE = '99991231'

取当天的全量:V_DATA_DATE BETWEEN SDATE AND EDATE

取当天的增量:SDATE = V_DATA_DATE

流程:

1.判断是否重跑,如果重跑,将不应该存在的日期的数据删掉,当日的也要删,将闭链的数据重新开链

2.如果不是重跑,用目标表MINUS源表,得到上游系统删除了的数据并将其闭链,再用源表MINUS目标表,得到上游系统的增变量,将其插入到目标表,变化了的数据闭链

伪代码:

目标表:DT,源表 ST,临时表TT,主键PK,其他字段OCLM,开始日期SDATE,结束日期EDATE,跑批日期V_DATA_DATE,昨天V_LAST_DATE,99991231 V_EDATE

1.判断是否重跑 如果是,则需要删掉当天及以后所有新增的数据,修改掉当天及以后闭链了的数据

首先删掉所有新增的数据,包括当天的和当天以后的所有的

DELETE FROM DT WHERE SDATE>=V_DATA_DATE

然后修改掉当天及以后闭链了的数据,可采用先INSERT 再 DELETE 或者 UPDATE的方式,UPDATE的方式便于理解,但是效率较差,下面是INSERT 再DELETE 的方式将闭链数据重新开链

INSERT INTO DT

SELECT SDATE,V_EDATE,PK,OCLM

FROM DT

WHERE EDATE>=V_LAST_DATE AND EDATE = V_EDATE;

DELETE FROM DT WHERE EDATE>=V_LAST_DATE AND EDATE = V_EDATE;

COMMIT;

下面是UPDATE的方式将闭链数据重新开链,和上面的选一个就行,不用都有

UPDATE DT SET EDATE = V_EDATE WHERE EDATE>=V_LAST_DATE AND EDATE = V_EDATE;

以上处理完重跑的数据,开始正式处理新来的数据

首先,将源系统删除了的数据闭链,用V_LAST_DATE那天的全量数据和源表(当天数据)的主键进行对比,找到删除了的数据,放到临时表,记得放之前清空临时表

TRUNCATE TABLE TT;

INSERT INTO TT

SELECT PK

FROM DT

WHERE V_LAST_DATE BETWEEN SDATE AND EDATE

MINUS

SELECT PK

FROM ST

如果临时表里有数据,就说明有删除了的数据,要将其闭链,方式是用临时表和源表关联,如果关联的上,说明临时表里有,然后根据主键,将其闭链,先插入闭链数据,再删除未闭链数据,同样可以采用UPDATE的写法

INSERT INTO DT SDATE,EDATE,PK,OCLM

SELECT SDATE,V_LAST_DATE,PK,OCLM

FROM DT

WHERE EXITS(SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

DELETE FROM DT WHERE EXISTS(SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

UPDATE写法:

UPDATE DT SET EDATE WHERE EXISTS(SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

以上反减结束,处理完上游删除了的数据,接下来处理增变量的数据,首先清空临时表TT,然后用源表MINUS目标表得到增变量数据放到临时表里,然后将临时表和目标表关联,关联上的数据就是增变量数据,然后将变化了的数据闭链,然后插入所有增变量到目标表DT

TRUNCATE TABLE TT;

INSERT INTO TT PK,OCLM

SELECT PK,OCLM

FROM ST

MINUS

SELECT PK,OCLM

FROM DT

WHERE V_LAST_DATE BETWEEN SDATE AND EDATE

COMMIT;

INSERT INTO DT

SELECT SDATE,V_LAST_DATE AS EDAET ,PK,OCLM

FROM DT

WHERE EXISTS (SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

DELETE FROM DT

WHERE EXISTS (SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

COMMIT;

此次闭链依然可以采用UPDATE的方式

UPDATE DT SET EDATE = V_LAST_DATE WHERE EXISTS (SELECT 'X' FROM TT WHERE TT.PK = DT.PK)

AND EDATE = V_EDATE

以上将所有当日变化了的数据闭链完毕,还需将新增的数据和闭链了的数据的最新数据插入到目标表

INSERT INTO DT

SELECT SDATE,V_EDATE,PK,OCLM

FROM TT

COMMIT;

到此结束整个拉链流程

注意:

清空临时表尽量不要用EXECUTE IMMEDIATE 的方式,因为这种方式是硬解析,慢,而且会屏蔽掉隐含的错误,在编译的时候看不出来,只有执行的时候才会看出来,所以没必要把用户名和表名写成参数传进去,直接写死,快,又不会出现编译看不出来的错

/*+APPEND*/ 是用来提高INSERT的速度的,不记录undo 和 redo ,至于什么是undo和redo就要再说了

记录数据条数一定要在COMMIT前,V_CNT := SQL%ROWCOUNT,否则一提交这个值就是0了,就起不了作用了

RAISE_APPLICATION_ERROR是啥???

数据存储方式之历史拉链相关推荐

  1. 《iOS取证实战:调查、分析与移动安全》一3.4 数据存储方式

    3.4 数据存储方式 iPhone上的数据以很多方式进行存储.下面的小节涵盖了每一个数据存储的形式以供审查者了解潜在的证据如何定位或恢复. 内部存储: SQLite 数据库文件: 属性列表: 网络: ...

  2. Android中的5种数据存储方式

    Android中的5种数据存储方式 Android中的5种数据存储方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPref ...

  3. js cookie 存储checkbox_浏览器数据存储方式总结,网友:“精辟”!

    今天主要来讲下前端的数据存储,说起数据存储,大家肯定第一时间想起cookie,localstorage,sessionstorage,而其实还有userData和IndexedDB这两种数据存储,接下 ...

  4. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  5. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引

    1.概述 转载:ClickHouse表引擎 MergeTree 索引与数据存储方式 2.一级索引 MergeTree 主键使用 primary key 定义,定义主键后,会将数据依据 index_gr ...

  6. IOS的四种数据存储方式及优劣

    IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用 ...

  7. html存储数据的方法,数据存储方式有哪些

    数据存储方式:1.顺序存储方法,结点间的逻辑关系由存储单元的邻接关系来体现.2.链接存储方法,结点间的逻辑关系由附加的指针字段表示.3.索引存储方法.4.散列存储方法,根据结点的关键字直接计算出该结点 ...

  8. ios应用数据存储方式(偏好设置)

    iOS开发UI篇-ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  9. android常用的存储方式,Android 常见数据存储方式

    Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串.布尔值.基础数据.集合等数据.常用于存储较简单的参数设置. 2 ...

最新文章

  1. 有勇气的牛排---算法与数据
  2. Serializable Parcelable
  3. 掌握AI核心技巧,一站式数据采集处理与智能识别公开课
  4. ionic最新安装教程
  5. python 3 5_零基础学Python3(5):基础运算符(上)
  6. 自动驾驶安全驾驶规则_自动驾驶知识科普 自动驾驶汽车的七大核心技术
  7. 网上购物与开店赢家随身查
  8. 【C++】获取二维数组的行和列
  9. 数值分析期末考试复习(逼近问题)
  10. pcb怎么画边框_PCB设计--PCB画图技巧
  11. JavaScript生成uuid
  12. “两地三中心”和“双活”简介--容灾技术方案
  13. ucloud的弹性计算
  14. 初中英语多词性单词怎么办_初中英语词性的分类及用法
  15. java计算机毕业设计vue健康餐饮管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  16. matlab导入word数据,matlab导入word
  17. 新三板的合作门槛是多少?
  18. android 科技动画,android开发ViewFlipper触摸动画
  19. SR与BRAS的区别
  20. Vue项目中用户的头像展示

热门文章

  1. (转)IT业搞笑笑话.(爆笑二)
  2. 苹果x怎么关机_苹果手机关机键怎么挂断电话
  3. servlet-mapping之url-pattern 个人理解
  4. FZU Problem 2221 RunningMan(思维考查)——第六届福建省大学生程序设计竞赛-重现赛
  5. 正则表达式--元字符的使用
  6. 产品研发与项目开发的差别
  7. MySQL当中的 “My” 是什么意思?
  8. 引用项目管理理念提升淘宝网店运营水平(转)
  9. 用Python3批量获取街景图片
  10. 安卓:推荐一个省电的方法,附安兔兔CPU大师破解版