PostgreSQL存储过程(四):追加指定日期区间数据

news/2025/2/22 13:38:18

需求介绍:

 

        本次的目标是实现追加指定区间内的历史数据,且仅保存指定日期区间内月份月末一天的数据的函数。在文章三中介绍了方便一次性使用的匿名代码块,但匿名代码块对脚本的封装能力有限,本次使用普通的函数进行实现。【注:函数设计应该尽量解耦合,因此本文实现的代码更优的方式是拆分为插入一个月数据的函数及一个负责调用的循环函数。】

通用程序框架:

        通用的程序脚本如下,在类似的场景下可以直接在函数体中填充需要的业务逻辑代码。

start_dt:起始日期
end_dt:结束日期
p_result:返回结果变量
-------------------
CREATE OR REPLACE FUNCTION mydb.mysc.generate_data(IN start_dt DATE,IN end_dt DATE,OUT p_result VARCHAR(1000))
    AS 
	$BODY$ 
			DECLARE 
			dura_dt DATE[];
			counter int = 1;
			-- 初始化将传入的起始日期取月末日期
			step_dt DATE:=(date_trunc('MONTH', start_dt) + INTERVAL '1 MONTH - 1 day')::date;
			-- 初始化将传入的结束日期取月末日期
			last_dt DATE:=(date_trunc('MONTH', end_dt) + INTERVAL '1 MONTH - 1 day')::date;
			-- 定义两个临时变量
			tmp_p VARCHAR(1000)=''; -- 用于拼接查询结束的返回信息
			tmp_dt DATE; -- 用于FOREACH循环
		BEGIN
			LOOP
			if step_dt <= last_dt then
				dura_dt[counter] := step_dt;
				step_dt:=(date_trunc('MONTH', step_dt) + INTERVAL '2 MONTH - 1 day')::date;
				counter:=counter+1;			
			end if;
			EXIT WHEN step_dt > last_dt;
			END LOOP;	
			FOREACH tmp_dt IN ARRAY dura_dt LOOP

                /* 插入数据的逻辑代码开始 */
                ----------------------------------------
                -- 编写业务逻辑代码,日期使用变量tmp_dt
                ----------------------------------------
                /* 插入数据的逻辑代码结束 */
				tmp_p := tmp_p||'已追加'||tmp_dt||'数据;'||E'\n';
				raise notice ' %', tmp_p;
			END LOOP;
			p_result:=tmp_p;
		END;
	$BODY$ 
    LANGUAGE 'plpgsql'			-- 指定函数的程序语言
    VOLATILE					-- 优化器不进行优化
   RETURNS NULL ON NULL INPUT; -- 当传入参数含有null时返回null

使用函数追加指定日期区间数据的函数实现:

        示例脚本使用的数据表依旧是文章三中创建的learn01表。

start_dt:起始日期
end_dt:结束日期
p_result:返回结果变量
-------------------
CREATE OR REPLACE FUNCTION mydb.mysc.generate_data(IN start_dt DATE,IN end_dt DATE,OUT p_result VARCHAR(1000))
    AS 
	$BODY$ 
			DECLARE 
			dura_dt DATE[];
			counter int = 1;
			-- 初始化将传入的起始日期取月末日期
			step_dt DATE:=(date_trunc('MONTH', start_dt) + INTERVAL '1 MONTH - 1 day')::date;
			-- 初始化将传入的结束日期取月末日期
			last_dt DATE:=(date_trunc('MONTH', end_dt) + INTERVAL '1 MONTH - 1 day')::date;
			-- 定义两个临时变量
			tmp_p VARCHAR(1000)=''; -- 用于拼接查询结束的返回信息
			tmp_dt DATE; -- 用于FOREACH循环
		BEGIN
			LOOP
			if step_dt <= last_dt then
				dura_dt[counter] := step_dt;
				step_dt:=(date_trunc('MONTH', step_dt) + INTERVAL '2 MONTH - 1 day')::date;
				counter:=counter+1;			
			end if;
			EXIT WHEN step_dt > last_dt;
			END LOOP;	
			FOREACH tmp_dt IN ARRAY dura_dt LOOP
                /* 插入数据的逻辑代码开始 */
                ----------------------------------------
				-- 确保该日期无数据
				DELETE FROM mydb.mysc.learn01 WHERE statistics_dt = tmp_dt;
				-- 每个数据日期下插入1000条数据
				FOR i IN 1..1000 LOOP
					INSERT INTO mydb.mysc.learn01
						(statistics_dt 
						,cust_id 		
						,cust_name 		
						,aum_avg 		
						,age 			
						,gender )
					VALUES(
						tmp_dt
						,RIGHT('000'||i,4)
						,'编号'||RIGHT('000'||i,4)
						,CAST(RANDOM() * 10000  AS decimal(16,2))
						,CAST(RANDOM() * 90  AS INT)
						,CAST(CAST(RANDOM() * 90  AS INT)%2 AS CHAR));
					i:=i+1;
				END LOOP;
                /* 插入数据的逻辑代码结束 */
                ----------------------------------------
				tmp_p := tmp_p||'已追加'||tmp_dt||'数据;'||E'\n';
				raise notice ' %', tmp_p;
			END LOOP;
			p_result:=tmp_p;
		END;
	$BODY$ 
    LANGUAGE 'plpgsql'			-- 指定函数的程序语言
    VOLATILE					-- 优化器不进行优化
   RETURNS NULL ON NULL INPUT; -- 当传入参数含有null时返回null

调用函数追加2020年12个月月末数据:

验证数据:


http://www.niftyadmin.cn/n/896542.html

相关文章

python老牌语言_编程语言世界杯,Python击败老牌劲旅Java夺冠

本文1346字&#xff0c;阅读大概需要 4 分钟。世界杯激战正酣&#xff0c;克罗地亚突围成功&#xff0c;与年轻的法国队会师决赛。周日晚北京时间23:00将会决出本届世界杯的冠军。谁将会捧起大力神杯&#xff1f;我们拭目以待&#xff01;买定离手&#xff01;于此同时&#xf…

PostgreSQL存储过程(五):函数返回值

返回值介绍&#xff1a; PostgreSQL函数提供了OUT关键字和RETURNS两种语法来实现返回值的定义&#xff0c;其中RETURNS关键字需要在函数体中使用RETURN关键字指明返回的变量&#xff0c;示例脚本如下&#xff1a; 1. 通过OUT关键字指定返回值 ------------------- CREATE OR R…

string 赋值给数组_【Java从入门到进阶】深入学习 Java数组

这是为小白定制的专属《Java从入门到进阶》系列。涵盖了JavaSE的所有知识点&#xff0c;内容由浅入深&#xff0c;配合案例快速上手。目标就是帮助小白或者准备面试的小伙伴以最快的速度熟悉Java语法&#xff0c;少走弯路&#xff01;1、数组定义Java中数组的定义有三种方式&am…

python递归实现二叉树_python3实现二叉树的遍历与递归算法解析(小结)

1、二叉树的三种遍历方式二叉树有三种遍历方式&#xff1a;先序遍历&#xff0c;中序遍历&#xff0c;后续遍历 即&#xff1a;先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根遍历总体思路&#xff1a;将树分成最小的子树&#xff0c;然后按照顺序输出1…

PostgreSQL存储过程(六):结构控制和循环

结构控制和循环介绍&#xff1a; 作为编程语言中极为重要的知识&#xff0c;控制和循环可以降低代码量和减少人的工作量。在PL/PGSQL中实现了常用的控制结构和循环方法&#xff0c;灵活使用确实可以用来提高数据库查询的效率。 结构控制&#xff1a; 1. 结构&#xff1a;IF .…

Hive SQL进阶案例(一):使用LAG函数判断日期连续性

一、LAG函数介绍 LAG函数是一个常用的窗口函数&#xff0c;作用是取当前行之后的数据&#xff0c;即把该列数据向上错位。使用方法如下&#xff1a; LAG(col ,n ,Default) col是字段名称&#xff0c;指明要操作的列&#xff0c;必须指定该参数&#xff1b; n表示取当前行的后…

Android Spinner下拉框使用

Spinner下拉框效果如下&#xff1a; 1.activity_main.xml&#xff0c;Spinner下拉框 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"…

python oserror errorno 39_python的bug? OSError: [Errno 9] Bad file number

前面发贴问了怎么定义一个全局变量&#xff0c;后来发现不是变量作用范围的问题。运行log:rootPandora # ./TestCase.pyTraceback (most recent call last):File "./TestCase.py", line 44, in TC.setup()File "./TestCase.py", line 31, in setupGWchild.…