PL/SQL拉链表

练习:-- 拉链表练习:
维度表源表
ID    M_NAME    REST     UP_DATE   
1     车贷       0.01      2022/12/1
2     房贷       0.03      2022/12/1
3     经营贷    0.015    2022/12/1

维度表拉链表
ID    M_NAME    REST     BEGIN_DATE    END_DATE  
1     车贷        0.01      2022/12/1     4712/12/31
2     房贷        0.03      2022/12/1     4712/12/31
3     经营贷    0.015    2022/12/1     4712/12/31

---------------------------------------------------------
维度表源表
ID    M_NAME    REST     UP_DATE   
1     车贷       0.02      2023/1/1   --变化的数据
2     房贷       0.03      2022/12/1  
3     经营贷    0.015   2022/12/1
4     彩礼贷    0.04     2023/1/1   --新增的数据
5     育儿贷    0.03     2023/1/1   --新增的数据

维度表拉链表
ID    M_NAME    REST     BEGIN_DATE    END_DATE  
1     车贷        0.01     2022/12/1      2023/1/1       ---闭链 或 无效的
2     住房贷    0.03      2022/12/1     2023/1/1 
3     经营贷    0.015    2022/12/1     4712/12/31
1     车贷        0.02     2023/1/1        4712/12/31   ---原记录的开链记录
4     彩礼贷    0.04      2023/1/1       4712/12/31   ---新增记录的开链记录
5     育儿贷    0.03      2023/1/1       4712/12/31   ---新增记录的开链记录

CREATE TABLE LOAN_PRODUCTS (ID NUMBER,M_NAME VARCHAR2(255),REST NUMBER(10,3),UP_DATE DATE);INSERT INTO LOAN_PRODUCTS VALUES(1,'车贷',0.01,TO_DATE(20221201,'YYYYMMDD'));
INSERT INTO LOAN_PRODUCTS VALUES(2,'房贷',0.03,TO_DATE(20221201,'YYYYMMDD'));
INSERT INTO LOAN_PRODUCTS VALUES(3,'经营贷',0.015,TO_DATE(20221201,'YYYYMMDD'));
COMMIT;SELECT * FROM LOAN_PRODUCTS;

-- 根据源表的数据建表,并添加拉链字段

CREATE TABLE LOAN_PRODUCTS_LALIAN
AS
SELECT T.ID,T.M_NAME,T.REST,T.UP_DATE BEGIN_DATE,TO_DATE(47121231,'YYYYMMDD') END_DATE
FROM LOAN_PRODUCTS T;

源表数据发生变化:
--新增两个贷款产品

INSERT INTO LOAN_PRODUCTS VALUES(4,'经营贷',0.04,TO_DATE(20230101,'YYYYMMDD'));
INSERT INTO LOAN_PRODUCTS VALUES(5,'育儿贷',0.03,TO_DATE(20230101,'YYYYMMDD'));
COMMIT;

--车贷利息发生变化

UPDATE LOAN_PRODUCTS SET REST=0.02,UP_DATE=TO_DATE(20230101,'YYYYMMDD') WHERE ID = 1;
UPDATE LOAN_PRODUCTS SET M_NAME='住房贷',UP_DATE=TO_DATE(20230101,'YYYYMMDD') WHERE ID = 2;
COMMIT;

-- 查询表中的数据

SELECT * FROM LOAN_PRODUCTS FOR UPDATE; ----源表
SELECT * FROM LOAN_PRODUCTS_LALIAN FOR UPDATE;----拉链表

加上FOR UPDATE可以在下面查询的结果,直接改数据 

-- 拉链表业务的3个步骤:
1.先判断源表有没有数据发生变化,有发生变化的则插入新的开链记录.
2.把这次有发生变化的拉链表记录,做闭链
3.判断源表有没有新的记录,有则往拉链表增加新的开链记录.

CREATE OR REPLACE PROCEDURE SP_LALIAN_EXISTS
AS
-- 1. 将源表和目标表的数据进行比较,将修改的数据放入到游标中 
CURSOR C_LOAN
IS 
SELECT 
L.ID,
L.M_NAME,
L.REST,
L.UP_DATE
FROM LOAN_PRODUCTS L
WHERE EXISTS(
SELECT 1
FROM LOAN_PRODUCTS_LALIAN T2
WHERE T2.ID=L.ID
AND (T2.M_NAME<>L.M_NAME OR T2.REST<>L.REST)
AND T2.END_DATE=TO_DATE('47121231','YYYYMMDD')
);BEGIN
-------------------------------------------------------------------------------- 1先判断 源表有没有发生变化,有发生变化,则插入新的开练记录
INSERT INTO LOAN_PRODUCTS_LALIANSELECT T1.ID,T1.M_NAME,T1.REST,T1.UP_DATE,TO_DATE(47121231,'YYYYMMDD') -- 开链记录插入FROM LOAN_PRODUCTS T1WHERE EXISTS (SELECT 1FROM LOAN_PRODUCTS_LALIAN T2WHERE T1.ID=T2.ID AND (T1.M_NAME <> T2.M_NAME OR T1.REST <> T2.REST)AND T2.END_DATE=TO_DATE(47121231,'YYYYMMDD')); --------------------------------------------------------------------------------------- 2把这次发生变化的拉链表记录,做闭链FOR X IN  C_LOAN LOOPUPDATE LOAN_PRODUCTS_LALIAN SET END_DATE=X.UP_DATEWHERE ID=X.ID AND (M_NAME <> X.M_NAME OR REST<>X.REST)AND END_DATE=TO_DATE(47121231,'YYYYMMDD');END LOOP;
--------------------------------------------------------------------------------------- 3.判断源表有没有新的记录,有则往拉链表增加新的开链记录INSERT INTO LOAN_PRODUCTS_LALIAN SELECT T1.ID,T1.M_NAME,T1.REST,T1.UP_DATE,TO_DATE(47121231,'YYYYMMDD')FROM LOAN_PRODUCTS T1WHERE NOT EXISTS(SELECT 1FROM LOAN_PRODUCTS_LALIAN T2WHERE T1.ID=T2.ID);END SP_LALIAN_EXISTS;

调用

BEGINSP_LALIAN_EXISTS();
END;SELECT * FROM LOAN_PRODUCTS_LALIAN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/129242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平凡工作也能创造奇迹:学习公文的写作逻辑和技巧

引言 如何把平凡的工作写出光环 &#x1f4dc; 很多初入职场的人在撰写个人先进事迹材料时面临的最大问题是&#xff1a;他们认为自己做的工作都是琐碎且普通的&#xff0c;没有任何惊天动地的成就或值得称赞的成绩。因此&#xff0c;他们感到非常困惑&#xff0c;不知道该如何…

elasticSearch7.9数据占用磁盘存储空间情况

最近&#xff0c;在VMware Workstation虚拟机上安装了es7.9&#xff0c;单节点的es&#xff0c;不是集群&#xff0c;然后建了一个索引&#xff08;包含3个分片和一个副本&#xff09;&#xff0c;插入了500万条数据&#xff0c;占据磁盘空间17G。如下图&#xff1a; 索引的字…

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用&#xff0c;让项目中的业务逻辑代码和数据表现代码分离&#xff0c;让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…

如何使用 ChatGPT 创建强大的讲故事广告

shadow&#xff1a; 使用AI技术来辅助创作故事越来越流行&#xff0c;从事营销相关工作的人员需要不断适应和学习新的技术和工具&#xff0c;以应对行业的变化和挑战。 如何使用ChatGPT创建讲故事的广告&#xff1a; A. 确定品牌故事和信息传递B. 确定目标受众C. 开发概念D. 使…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack

堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 二、…

c++视觉---中值滤波处理

中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性平滑滤波方法&#xff0c;用于去除图像中的噪声。它不像线性滤波&#xff08;如均值滤波或高斯滤波&#xff09;那样使用权重来计算平均值或加权平均值&#xff0c;而是选择滤波窗口内的像素值中的中间值作为输…

真香!Jenkins 主从模式解决问题So Easy~

01.Jenkins 能干什么 Jenkins 是一个开源软件项目&#xff0c;是基于 Java 开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 中文官网&#xff1a;https://jenkins.io/zh/ 0…

香港Web3.0生态现状

目前香港Web3.0生态正在快速发展。香港政府和金融机构正在积极推动Web3.0生态的建设&#xff0c;以推动数字经济和智慧城市的发展。香港政府已经发布了有关虚拟资产发展的政策宣言&#xff0c;鼓励和监管并重&#xff0c;加大力度推动虚拟资产产业向前发展。同时&#xff0c;香…

如何开始学习量子机器学习

一、关于量子计算 这是我关于量子机器学习&#xff08;QML&#xff09;的第二篇文章&#xff0c;这是第一篇&#xff0c;关于为什么你应该开始学习QML。 开始研究量子机器学习很困难&#xff0c;因为我不知道我需要了解多少量子力学和计算知识。我在101年上大学时上了量子力学2…

Kubernetes概述架构与工作流程简述

文章目录 Kubernetes概述Kubernetes优势Kubernetes 集群组件控制平面组件Node 组件 Kubernetes工作流程下期预告 Kubernetes概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥…

剑指offer——JZ68 二叉搜索树的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q&#xff0c;最近公共祖先LCA(T,p,q)表示一个节点x&#…

《动手学深度学习 Pytorch版》 8.1 序列模型

到目前为止&#xff0c;我们遇到的数据主要是表格数据和图像数据&#xff0c;并且所有样本都是独立同分布的。然而&#xff0c;大多数的数据并非如此。比如语句中的单词、视频中的帧以及音频信号&#xff0c;都是有顺序的。 简言之&#xff0c;如果说卷积神经网络可以有效地处…