一、数据准备

1:数据缓冲层(流水表)建表TBL:S01_LSB.SQL

CREATE TABLE S01_LSB (ACTNO NUMBER(4)  PRIMARY KEY,OPNAME VARCHAR(10) ,PASSWD VARCHAR(6)  ,CASH NUMBER(10,2)  ,OPDATE DATE  ,OPADDR VARCHAR(30)
)
;
-- Add comments to the table
comment on table S01_LSB
is '业务帐号流水表';
-- Add comments to the columns
comment on column S01_LSB.ACTNOis '帐号';
comment on column S01_LSB.OPNAMEis '开户人姓名';
comment on column S01_LSB.PASSWDis '密码';
comment on column S01_LSB.CASHis '余额';
comment on column S01_LSB.OPDATEis '开户日期';
comment on COLUMN S01_LSB.OPADDRis '开户地址';

二:数据贴源层(拉链表)建表QSL:S01_LLB.SQL

CREATE TABLE S01_LLB (ACTNO NUMBER(4)  PRIMARY KEY,OPNAME VARCHAR(10) ,PASSWD VARCHAR(6)  ,CASH NUMBER(10,2)  ,OPDATE DATE  ,OPADDR VARCHAR(30),ETL_START_DATE DATE,ETL_END_DATE DATE
)
;
-- Add comments to the table
comment on table S01_LSB
is '业务帐号流水表';
-- Add comments to the columns
comment on column S01_LSB.ACTNOis '帐号';
comment on column S01_LSB.OPNAMEis '开户人姓名';
comment on column S01_LSB.PASSWDis '密码';
comment on column S01_LSB.CASHis '余额';
comment on column S01_LSB.OPDATEis '开户日期';
comment on COLUMN S01_LSB.OPADDRis '开户地址';

二、拉链脚本

一:环境变量、子程序

二:流水表拉链SQL部分

–此脚本算法是从技术缓冲层(SDB)向近源模型层(ODB)加载状态类有删除表的带删除拉链算法(FULL JOIN方式)

–Step0:按照目标表相同的结构创建临时表,用于存放今天发生了增、改、删的,需要处理的数据;

DROP TABLE scott.T_S01_LLB;
commit;WHENEVER SQLERROR EXIT SQL.SQLCODE;
CREATE TABLE scott.T_S01_LLB AS
SELECT T.*,' 'as DEL_IND FROM scott.S01_LLB T
WHERE  1=2;
commit;WHENEVER SQLERROR EXIT SQL.SQLCODE;
DELETE FROM  SCOTT.S01_LLB WHERE ETL_START_DATE >= SYSDATE;
commit;WHENEVER SQLERROR EXIT SQL.SQLCODE;
UPDATE  scott.S01_LLB SET ETL_END_DATE =  DATE '3000-12-31'
WHERE ETL_END_DATE >=SYSDATE;
commit;

删除旧临时表,同时删除ETL开始日期大于等于今天,修改ETL结束日期为今天的记录。
这一步的目的是为了支持重跑,当脚本报错或者需要修改时,删除今天拉链加载进模型层的数据,可以重新执行拉链脚本加载数据。
ETL_START_DATE与ETL_END_DATE可以按天结算(MM-DD-YYYY),这里偷懒直接读取系统时间,每次执行脚本都会根据系统时间判断新增数据;

–Step1:找出今天发生了增、删、改的记录,存入临时表;

INSERT /*+ append */ INTO scott.T_S01_LLB (ACTNO ,OPNAME,PASSWD ,CASH ,OPDATE ,OPADDR ,ETL_START_DATE,ETL_END_DATE,DEL_IND)
SELECTN.ACTNO, N.OPNAME, N.PASSWD, N.CASH, N.OPDATE, N.OPADDR                     , SYSDATE, DATE '3000-12-31', CASE WHEN ( N.ACTNO IS NULL ) THEN 'D' ELSE 'N' END
FROM (SELECTACTNO,OPNAME,PASSWD,CASH,OPDATE,OPADDRFROM SCOTT.S01_LSB ) N
FULL JOIN(SELECT ACTNO,OPNAME,PASSWD,CASH,OPDATE,OPADDRFROM SCOTT.S01_LLB WHERE ETL_END_DATE = DATE '3000-12-31' ) T
ON NVL(N.ACTNO,0)=NVL(T.ACTNO,0)
WHERE
( T.ACTNO IS NULL ) OR ( N.ACTNO IS NULL ) OR (NVL(N.OPNAME,0) <> NVL(T.OPNAME,0)
OR NVL(N.PASSWD,0) <> NVL(T.PASSWD,0)
OR NVL(N.CASH,0) <> NVL(T.CASH,0)
OR NVL(TO_CHAR(N.OPDATE),0) <> NVL(TO_CHAR(T.OPDATE),0)
OR NVL(N.OPADDR,0) <> NVL(T.OPADDR,0)
);
commit;

将T_S01_LLB中插入数据,内容为:S01_LSB与S01_LLB的全链接,连接条件是帐号相同,筛选出所有帐号相同,其他内容不同的记录、流水表有而拉链表没有的记录(标记DEL_IND为“N”,代表新增记录)、拉链表有而流水表没有的记录(标记DEL_IND为“D”,代表不需要从流水表拉链进入贴源层的记录)

–Step2:修改拉链表(将新变更的记录在拉链表中闭链)

merge into (SELECT * FROM SCOTT.S01_LLB WHERE ETL_END_DATE= DATE '3000-12-31') Tusing SCOTT.T_S01_LLB N on  ( NVL(N.ACTNO,0)=NVL(T.ACTNO,0) )when MATCHED then update set    ETL_END_DATE=SYSDATE
;
commit;

用T_S01_LLB与S01_LLB进行merge更新,将上一部插入临时表所有新变更记录、与拉链表帐号相同的旧记录merge into比对,对匹配到的正式拉链表中的记录ETL_END_DATE时间从无穷大闭链为当前时间。

–Step3:插入新增、修改和删除的记录;

INSERT INTO SCOTT.S01_LLB
SELECTACTNO ,OPNAME,PASSWD ,CASH ,OPDATE ,OPADDR ,ETL_START_DATE,ETL_END_DATE
FROM SCOTT.T_S01_LLB
WHERE DEL_IND='N';
COMMIT;

这里DEL_IND为“N”的记录包括两部分:
①:拉链表中无,流水表中有的记录<CASE WHEN ( N.ACTNO IS NULL ) THEN ‘D’ ELSE ‘N’ END>;
②:拉链表与流水表匹配到且满足where条件内容变更的记录
拉链到此已完成从流水表更新到了拉链表。

三、测试


在这里看到是当前的流水表;

这是拉链表,可以看到曾经的闭链时间,闭链后新增的数据。

数据库SDB数据缓冲层(TBL数据缓冲层)向ODB数据贴源层(QSL近源模型层)拉链算法脚本【SQL部分】相关推荐

  1. 数据库初学者_面向初学者的免费6小时数据科学课程

    数据库初学者 Data science is considered the "sexiest job of the 21st century." Learn data scienc ...

  2. 不影响数据库运行如何快速恢复刚删除的表及其数据(二)如何恢复刚才删除的一条数据...

    不影响数据库运行如何快速恢复刚删除的表及其数据(二) 如何恢复刚才删除的一条数据 比如执行了delete from emp where ename='FORD';如何恢复刚刚删除的记录. 执行如下语句 ...

  3. php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...

    php中如何将execl的数据导入到数据库中 php导出大量数据的Excel: PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题 Excel可以支持100万行记录,Ex ...

  4. 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...

    问题描述 SQL Server数据库中,有时候当我们使用INSERT INTO语句写入数据后,需要返回写入数据对应的自增ID或者GUID,以便根据此记录进行后续的操作.那么SQL语句如何实现返回记录值 ...

  5. mysql 查询不为0的数据_查询数据库中所有记录总数不为0的数据表名称

    [如何查询postgreSQL 里面某个数据库中所有用户定义的数据表的名字@forandever 2011-11-131.通过命令行查询\d 数据库  -- 得到所有表的名字\d 表名  -- 得到表 ...

  6. mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)

    关于mysql数据库在没有主键情况下去除重复数据办法 约定 表名:mat 根据 cat 字段去重 新增加主键为 id 步骤 1.为mat新增一列自增主键 alter table mat add col ...

  7. 数据库查询经常卡死?面对亿级大数据量,我是这么展示分析的

    建议你们看到文末,不会亏待你们 日常一提数据分析和可视化,就想到这个工具操作要多简单易用,图表要多美多炫,然而总是忽略背后的数据支撑. excel 几十万行数据就卡死崩,谈何数据透视表.可视化? 近千 ...

  8. 大数据 数据库 评测_为什么腾讯QQ的大数据平台选择了这款数据库?

    导读:本文带你了解一个开源的.高性能的时序型数据库--InfluxDB. 作者:韩健来源:大数据DT(ID:hzdashuju) 00 为什么QQ要选择InfluxDB?从2016年起,笔者在腾讯公司 ...

  9. php mysql 复制数据库表结构图_MySQL_Mysql复制表结构、表数据的方法,本文给大家分享了好几种复制 - phpStudy...

    Mysql复制表结构.表数据的方法 本文给大家分享了好几种复制表结构.表数据的示例介绍,具体详情请看下文吧. 1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 ...

最新文章

  1. 数据库的这些性能优化,你做了吗?
  2. java 气泡_Java气泡提示功能实现
  3. 第十四章 降维操作-机器学习老师板书-斯坦福吴恩达教授
  4. python向数据库写入数据_如何用Python向Mysql中插入数据
  5. kibana一直弹出来报错?
  6. 分子排列不同会导致_生物信息遇上Deep learning(7): ReLeaSE--强化学习做药物分子设计...
  7. Linux hostname指令
  8. Teams App抽奖机器人 - 基础架构
  9. 【ubuntu】给新装好的UBUNTU系统配置静态IP
  10. Google 高薪争夺 Rust 人才,将用 Rust 重构关键组件!
  11. Widows Live Writer
  12. vant + Vue创建项目全过程
  13. P5514 [MtOI2019]永夜的报应
  14. ae导出html,动画还原100%-AE一键导出
  15. 神威计算机英语,“神威太湖之光”取代“天河二号” 成全球最快超级计算机...
  16. Apriori算法学习和java实现
  17. pytorch中Parameter()介绍
  18. 基于UAAG2.0 Reference的移动无障碍案例(四)
  19. java 轻量级插件化框架_轻量级插件化框架——Small
  20. 软件开发成本计价及相关问题

热门文章

  1. 电子商务平台简介——Makingware
  2. Xiaojie雷达之路---TI实战笔记---BPM MIMO
  3. 鼎科TSUX6V6.0-E液晶电视驱动板维修
  4. LeetCode-39 - 组合总和
  5. 文思海辉金融:交易银行未来一站式服务体系建设的实践与思考
  6. 右键图形属性 图形选项_如何调整视频游戏选项以获得更好的图形和性能
  7. ElasticSearch基础:从倒排索引说起,快速认知ES
  8. 谦卑若愚,好学若饥(Stay Hungry,Stay Foolish)
  9. 你了解净水器滤芯知识多少?
  10. 如何下载并安装turbo pascal 7.0?