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.mzph.cn/news/100510.shtml

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

相关文章

[ICCV-23] DeformToon3D: Deformable Neural Radiance Fields for 3D Toonification

pdf | code 将3D人脸风格化问题拆分为几何风格化与纹理风格化。提出StyleField&#xff0c;学习以风格/ID为控制信号的几何形变残差&#xff0c;实现几何风格化。通过对超分网络引入AdaIN&#xff0c;实现纹理风格化。由于没有修改3D GAN空间&#xff0c;因此可以便捷实现Edit…

mysql面试题34:Hash索引和B+树区别是什么?在设计索引怎么选择?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Hash索引和B+树区别是什么?在设计索引怎么选择? 在MySQL中,Hash索引和B+树索引是两种常见的索引类型,他们有以下区别: 数据结构:Hash索引:…

QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样 Chapter1 QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样一、本自制虚拟键盘特点二、windows打开系统自带软键盘三、让…

网工内推 | base郑州,上市公司,最高15薪,五险一金全额缴

01 四方达 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司数据中心&#xff08;机房&#xff09;的管理与运维工作。 2、负责公司服务器、路由器、防火墙、交换机等设备的管理、以及网络平台的运行监控和维护&#xff1b; 3、负责公司服务器运维管理工作、…

GNN+RA 文献阅读

[1] X. Wang et al., ‘Scalable Resource Management for Dynamic MEC: An Unsupervised Link-Output Graph Neural Network Approach’. paper code&#xff1a;GitHub - UNIC-Lab/LOGNN: This is the code for paper "Scalable Resource Management for Dynamic MEC:…

计算机网络 | 体系结构

计算机网络 | 体系结构 计算机网络 | 体系结构概念及功能计算机网络简介计算机网络的功能因特网发展阶段小结 组成与分类计算机网络的组成计算机网络的分类小结 标准化工作及相关组织速率相关性能指标速率带宽吞吐量小结 时延相关性能指标时延时延带宽积往返时延RTT利用率小结 …

1. Windows平台下如何编译C++版本的Redis库hiredis

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并…

HTTP长连接实现原理

1. HTTP长连接和短连接的定义 HTTP长连接 浏览器向服务器进行一次HTTP会话访问后&#xff0c;并不会直接关闭这个连接&#xff0c;而是会默认保持一段时间&#xff0c;那么下一次浏览器继续访问的时候就会再次利用到这个连接。在HTTP/1.1版本中&#xff0c;默认的连接都是长连…

JVM面试题:(二)内存结构和内存溢出、方法区的两种实现

内存结构&#xff1a; 方法区和对是所有线程共享的内存区域&#xff1b;而java栈、本地方法栈和程序员计数器是运行是线程私有 的内存区域。 Java堆&#xff08;Heap&#xff09;,是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内 存区域&#xff0c;在…

VuePress实现自动获取文章侧边栏目录功能

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机

文章目录 一、虚拟机二、关于消息的API发布消息直接交换机 DIRECT 转发规则扇出交换机 FANOUT 转发规则主题交换机 TOPIC 转发规则匹配规则Router类 订阅消息消费者队列如何给订阅的消费者发送消息自动发送消息至订阅者 应答消息 三、代码编写 一、虚拟机 接下来要创建虚拟机,…

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期&#xff0c;并且字体颜色啥的样式也要修改&#xff08;在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的&#xff0c;特此记录 官方文档 按照官方的说明&#xff0c;给v-model绑定一个字符串就可以了 在j…

AI能否取代程序员:探讨人工智能在编程领域的角色

引言&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;人们开始思考&#xff1a;AI是否能够取代程序员&#xff1f;这个问题引发了广泛的讨论和辩论。一些人认为&#xff0c;AI的出现将彻底改变编程的面貌&#xff0c;而另一些人则坚信&#xf…

大数据之LibrA数据库系统介绍

简介 LibrA是一个基于开源数据库Postgres-XC开发的分布式并行关系型数据库系统。 LibrA提供了以下功能&#xff1a; 标准SQL支持 支持标准的SQL92/SQL2003规范&#xff0c;支持GBK和UTF-8字符集&#xff0c;支持SQL标准函数与OLAP分析函数&#xff0c;支持存储过程。 数据库…

微信支付v2

文档&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序&#xff0c;&#xff0c;还需要一个&#xff0c;在微信商户平台&#xff0c;&…

串级/级联控制知识点整理

串级控制系统是改善控制质量的有效方法之一&#xff0c;在过程控制中得到了广泛的应用。所谓串级控制&#xff0c;就是采用两个控制器串联工作&#xff0c;外环控制器的输出作为内环控制器的设定值&#xff0c;由内环控制器的输出去操纵控制阀&#xff0c;从而对外环被控量具有…

mysql8压缩包安装

MySQL 8.0 版压缩包安装教程_mysql 压缩包 8.0安装-CSDN博客 1、mysql压缩包 2、参考链接一步一步操作即可。 3、安装&#xff0c;破解navicat. 4、无法连接&#xff0c;参考该链接修改&#xff1a; Mysql 解决1251- Client does not support authentication protocol reques…

android app开发环境搭建

Android是流行的移动设备原生应用开发平台&#xff0c;其支持Java语言以及Kotlin语言的开发环境&#xff0c;本文主要描述官方提供的Android studio集成开发环境搭建。 https://developer.android.google.cn/ 如上所示&#xff0c;从官方上下载最新版本的Android studio集成开…

【DevOps】搭建你的第一个 Docker 应用栈

搭建你的第一个 Docker 应用栈 1.Docker 集群部署2.第一个 Hello World2.1 获取应用栈各节点所需镜像2.2 应用栈容器节点互联2.3 应用栈容器节点启动2.4 应用栈容器节点的配置2.4.1 Redis Master 主数据库容器节点的配置2.4.2 Redis Slave 从数据库容器节点的配置2.4.3 Redis 数…