PL/SQL拉链表

news2024/11/24 4:50:04

练习:-- 拉链表练习:
维度表源表
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_LALIAN
  SELECT 
  T1.ID,
  T1.M_NAME,
  T1.REST,
  T1.UP_DATE,
  TO_DATE(47121231,'YYYYMMDD') -- 开链记录插入
  FROM LOAN_PRODUCTS T1
 WHERE EXISTS (
 SELECT 1
 FROM LOAN_PRODUCTS_LALIAN T2
 WHERE 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 LOOP
   UPDATE LOAN_PRODUCTS_LALIAN SET END_DATE=X.UP_DATE
   WHERE 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 T1
  WHERE NOT EXISTS(
  SELECT 1
  FROM LOAN_PRODUCTS_LALIAN T2
  WHERE T1.ID=T2.ID
  );
 
END SP_LALIAN_EXISTS;

调用

BEGIN
  SP_LALIAN_EXISTS();
END;

SELECT * FROM LOAN_PRODUCTS_LALIAN

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM作业1

三盏灯流水 代码 .text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0X50000A28 LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1 ORR R1,R1,#(0x3<<4) 第4位设置为1 STR R1,[R0] 写回2.设置PE10管…

STM32入门笔记14_RTC实时时钟

BKP和RTC实时时钟 BKP BKP简介 BKP(Backup Registers) 备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.0-3.6V) 电源被切断时&#xff0c;仍然由VBAT(1.8-3.6V) 维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;也不会被复位TAMPER引…

NoSQL之Redis 群集模式实现高可用

目录 1 Redis 群集模式 1.1 集群的作用&#xff0c;可以归纳为两点 1.2 Redis集群的数据分片 2 搭建Redis 群集模式 2.1 开启群集功能 2.2 启动redis节点 2.3 启动集群 2.4 测试群集 1 Redis 群集模式 集群&#xff0c;即Redis Cluster&#xff0c;是Redis 3.0开始引入…

基于FPGA的数字时钟系统设计

在FPGA的学习中&#xff0c;数字时钟是一个比较基础的实验案例&#xff0c;通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力&#xff0c;从而打好坚实的基本功&#xff0c;接下来就开始我们的学习吧&#xff01; 1.数码管介绍 数码管通俗理解就是将8个LED(包含…

ARM-day5作业

.text .global _start _start: 1、设置GPIOE、GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2、设置PE10、PF10、PE8管脚为输出模式 GPIOE_MODER[21:20]->01 0x50006000…

【数据恢复篇】记一次Winhex镜像还原(恢复)到磁盘测试记录

【数据恢复篇】记一次Winhex镜像还原&#xff08;恢复&#xff09;到磁盘测试记录 镜像恢复到磁盘&#xff0c;怎么操作&#xff1f;会不会对磁盘有影响&#xff0c;是恢复到空磁盘&#xff1f;还是恢复到有数据的磁盘也可以&#xff1f;有数据的盘磁盘空间很多&#xff0c;恢…

TDengine+OpenVINO+AIxBoard,助力时序数据分类

时间序列数据分析在工业&#xff0c;能源&#xff0c;医疗&#xff0c;交通&#xff0c;金融&#xff0c;零售等多个领域都有广泛应用。其中时间序列数据分类是分析时序数据的常见任务之一。本文将通过一个具体的案例&#xff0c;介绍 Intel 团队如何使用 TDengine 作为基础软件…

合适才是最好的!Mac或iPhone用户应该在家里更新Wi-Fi 6或6E路由器吗

Wi-Fi联盟制定了行业标准Wi-Fi设备的认证程序&#xff0c;几年前为所有出现的几代Wi-Fi创建了一个新的品牌体系。此前&#xff0c;Wi-Fi通常由IEEE工程标准组织不知名的工作组编号来识别&#xff0c;如802.11n或802.11ac。为了更简单地混合和匹配设备&#xff0c;并了解你使用的…

图观 | 从新加坡破获巨大洗钱案反观图数据库技术的重要性

前言&#xff1a; 新加坡破获的巨大洗钱案突显了金融领域对于高效数据管理和分析的需求&#xff0c;同时也凸显了图数据库技术在应对复杂犯罪网络和洗钱活动方面的重要性。传统的关系型数据库很难有效处理具有多层次关系和复杂连接模式的数据&#xff0c;而图数据库则以其在处…

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(三)

前言 目标识别如今以及迭代了这么多年&#xff0c;普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性…

高压放大器的主要技术指标是什么

高压放大器是一种特殊类型的放大器&#xff0c;主要用于将低电压信号放大到高电压水平。它在许多领域中具有重要的应用&#xff0c;如医学成像、科学研究、工业设备等。为了正确选择和评估高压放大器&#xff0c;我们需要了解其主要技术指标。以下是高压放大器的主要技术指标的…

Databend 开源周报第 113 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 数据导入具有额…

IO流 之 数据流 和 对象序列化

数据流 数据输出流&#xff08;DataOutputStream&#xff09;&#xff1a;允许把一些数据和其类型一起写道文件中去。 代码使用&#xff1a; package day0927;import java.io.DataOutput; import java.io.DataOutputStream; import java.io.FileOutputStream;public class de…

人体姿态标注

人体姿态标注 一 标注工具labelme1.1 安装方式1.2 界面说明 二 数据集准备 不要在网上搜图以下每张图片的命名方式&#xff1a;状态_学号_序号.jpg (注意 一定是jpg格式) 保存到一个文件夹中&#xff0c;便于标注。 例如&#xff1a;FALL_0000_0001.jpg 站立数据(UP)&#xff1…

C位操作符

目录 一、位操作符 1.位与& 2.位或| 3.位取反~ 4.位异或^ 5.位与&#xff0c;位或&#xff0c;位异或的特点总结 6.左移位《《 右移位 》》 二、位与&#xff0c;位或&#xff0c;位异或在操作寄存器时的特殊作用 1.寄存器操作的要求&#xff08;特定位改变而不…

社科院与杜兰大学能源管理硕士项目——惊喜会随时间慢慢酝酿而出

我们越来越难感受到惊喜&#xff0c;按部就班的生活让我们丧失了感知力&#xff0c;我们再难以被简单的确幸所打动。试试停下脚步&#xff0c;惊喜往往不期而遇。社科院与杜兰大学能源管理硕士项目是你人生中的小确幸吗 学习是一种持续不断的自我提升&#xff0c;它能让我们逐渐…

【Python_PySide2学习笔记(十五)】按键QPushButton类的基本用法

按键QPushButton类的基本用法 前言正文1、创建按键2、按键设置文本3、按键设置启用、禁用4、按键设置背景色及透明度5、按键设置字体、字体大小、字体颜色6、按键设置图标7、按键信号&#xff1a;被点击8、按键设置背景图片 前言 此篇文章中介绍PySide2中 按键QPushButton类的…

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序&#xff0c;允许你在沙箱环境中运行浏览器或其他程序&#xff0c;因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境&#xff0c;在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…

短视频时代的领军者:TikTok能否引领数字创新浪潮?

曾经&#xff0c;人们认为短视频只是娱乐和消遣的一种方式&#xff0c;然而&#xff0c;TikTok却颠覆了这一观念。它已经超越了娱乐&#xff0c;成为了一个强大的内容创作和传播平台&#xff0c;重新定义了数字时代的社交互动方式。 那么&#xff0c;TikTok是否真的能够引领创…

【arm实验1】GPIO实验-LED灯的流水亮灭

linuxlinux:~/study/01-asm$ cat asm-led.S .text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0X50000A28 LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1 ORR R1,R1,#(0x1<<4) 第4位设置为1 ORR R…