数据库SDB数据缓冲层(TBL数据缓冲层)向ODB数据贴源层(QSL近源模型层)拉链算法脚本【SQL部分】
一、数据准备
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部分】相关推荐
- 数据库初学者_面向初学者的免费6小时数据科学课程
数据库初学者 Data science is considered the "sexiest job of the 21st century." Learn data scienc ...
- 不影响数据库运行如何快速恢复刚删除的表及其数据(二)如何恢复刚才删除的一条数据...
不影响数据库运行如何快速恢复刚删除的表及其数据(二) 如何恢复刚才删除的一条数据 比如执行了delete from emp where ename='FORD';如何恢复刚刚删除的记录. 执行如下语句 ...
- php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...
php中如何将execl的数据导入到数据库中 php导出大量数据的Excel: PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题 Excel可以支持100万行记录,Ex ...
- 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...
问题描述 SQL Server数据库中,有时候当我们使用INSERT INTO语句写入数据后,需要返回写入数据对应的自增ID或者GUID,以便根据此记录进行后续的操作.那么SQL语句如何实现返回记录值 ...
- mysql 查询不为0的数据_查询数据库中所有记录总数不为0的数据表名称
[如何查询postgreSQL 里面某个数据库中所有用户定义的数据表的名字@forandever 2011-11-131.通过命令行查询\d 数据库 -- 得到所有表的名字\d 表名 -- 得到表 ...
- mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)
关于mysql数据库在没有主键情况下去除重复数据办法 约定 表名:mat 根据 cat 字段去重 新增加主键为 id 步骤 1.为mat新增一列自增主键 alter table mat add col ...
- 数据库查询经常卡死?面对亿级大数据量,我是这么展示分析的
建议你们看到文末,不会亏待你们 日常一提数据分析和可视化,就想到这个工具操作要多简单易用,图表要多美多炫,然而总是忽略背后的数据支撑. excel 几十万行数据就卡死崩,谈何数据透视表.可视化? 近千 ...
- 大数据 数据库 评测_为什么腾讯QQ的大数据平台选择了这款数据库?
导读:本文带你了解一个开源的.高性能的时序型数据库--InfluxDB. 作者:韩健来源:大数据DT(ID:hzdashuju) 00 为什么QQ要选择InfluxDB?从2016年起,笔者在腾讯公司 ...
- php mysql 复制数据库表结构图_MySQL_Mysql复制表结构、表数据的方法,本文给大家分享了好几种复制 - phpStudy...
Mysql复制表结构.表数据的方法 本文给大家分享了好几种复制表结构.表数据的示例介绍,具体详情请看下文吧. 1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 ...
最新文章
- 数据库的这些性能优化,你做了吗?
- java 气泡_Java气泡提示功能实现
- 第十四章 降维操作-机器学习老师板书-斯坦福吴恩达教授
- python向数据库写入数据_如何用Python向Mysql中插入数据
- kibana一直弹出来报错?
- 分子排列不同会导致_生物信息遇上Deep learning(7): ReLeaSE--强化学习做药物分子设计...
- Linux hostname指令
- Teams App抽奖机器人 - 基础架构
- 【ubuntu】给新装好的UBUNTU系统配置静态IP
- Google 高薪争夺 Rust 人才,将用 Rust 重构关键组件!
- Widows Live Writer
- vant + Vue创建项目全过程
- P5514 [MtOI2019]永夜的报应
- ae导出html,动画还原100%-AE一键导出
- 神威计算机英语,“神威太湖之光”取代“天河二号” 成全球最快超级计算机...
- Apriori算法学习和java实现
- pytorch中Parameter()介绍
- 基于UAAG2.0 Reference的移动无障碍案例(四)
- java 轻量级插件化框架_轻量级插件化框架——Small
- 软件开发成本计价及相关问题
热门文章
- 电子商务平台简介——Makingware
- Xiaojie雷达之路---TI实战笔记---BPM MIMO
- 鼎科TSUX6V6.0-E液晶电视驱动板维修
- LeetCode-39 - 组合总和
- 文思海辉金融:交易银行未来一站式服务体系建设的实践与思考
- 右键图形属性 图形选项_如何调整视频游戏选项以获得更好的图形和性能
- ElasticSearch基础:从倒排索引说起,快速认知ES
- 谦卑若愚,好学若饥(Stay Hungry,Stay Foolish)
- 你了解净水器滤芯知识多少?
- 如何下载并安装turbo pascal 7.0?