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

本文档介绍了一个PL/pgSQL函数,用于在数据库中插入指定日期区间内每个月末一天的历史数据。函数首先计算出起始和结束日期的月末日期,然后在循环中逐月插入数据,每次插入1000条记录。调用此函数可以为learn01表追加2020年12个月的数据。
摘要由CSDN通过智能技术生成

需求介绍:

 

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

通用程序框架:

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

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个月月末数据:

验证数据:

BOS 技术整理-02 Oracle 数据库安装配置使用 直接安装 打开服务 并尝试连接数据库 安装远程连接工具 PLSQLDeveloper 安装配置使用 2.在 PLSQL Developer 启动,配置 oracle instanceclient 目录 4、 默认 PLSQL Developer 连接 Oracle 使用客户端字符集 utf-8 , 基于工具使用 SQL 插入中文有乱码问题,设置客户端字符集 gb2312 配置 环境变量 NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 弹窗了,就表示成功了! 工具补充: Navicat Premium 安装和使用 直接安装 ok jquery easyui 总合 (直接看API文档 后期加上如何使用) Orcale 创建用户 先进入 Orcale 命令行 针对 BOS 系统建立新的用户 创建 bos/bos 账户, 授予角色 connect、resource -- Create the user create user BOS identified by "" default tablespace SYSTEM temporary tablespace TEMP profile DEFAULT password expire; -- Grant/Revoke role privileges grant connect to BOS; grant resource to BOS; -- Grant/Revoke system privileges grant unlimited tablespace to BOS; Spring 环境搭建 IOC 导入 context 依赖 beans、core、expression AOP 导入 测试集成 Web 集成 配置监听器 整合持久层框架 hibernate、jpa web.xml 配置 spring 监听器 src/main/resource 下 建立 applicationContext.xml rc/main/resource 提供 config.properties 外部属性文件、log4j.properties 日志配置文件 配置文件如下: applicationContext.xml  struts2 注解 类上 @ParentPackage 包继承谁? extends=”struts-default” @Namespace 包命名空间 namespace=”/” @Actions struts2 的 Action 配置,用于配置多个 Action 方法上 @Action 配置访问路径,和方法绑定 @Result 结果集配置  struts2 和 spring 整合 struts2 的 Action 使用 spring 注解,被 spring 管理 @Controller spring 表现层 bean @Scope 配置 Action 为多例 Spring Data JPA 代替了 Hibernate "CURD " 但是和Hibernate一样 实现DAO(数据)层的功能 "增删改查" Hibernate 实体类 生成表结构 ---- 领域(Domain)驱动建模 这次使用的是驱动建模,传统的设计模式是: 先设计表,再创建实体 JPA 注解使用 @Entity 标明是实体类 @Table 映射表名称 @Id 主键标识 @GeneratedValue 自动生成主键的值 @Column 设置映射数据表中列信息 @Temporal 控制数据表保存日期哪个部分(日期、时间、日期时间) @OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台处理 服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 Service 业务层实现类 在applicationContext添加一条 用来整合 Spring Data jpa <jpa:repositories base-package="cn.itcast.bao.dao" /> 注意: 这里的扫描包,必须指定到类的上级包 比如 一个类 com.itStone.bao.dao.test.java 那么它的上级包 就是 com.itStone.bao.dao 根级包是 : 就是 com 只需要编写 DAO 接口,继承 JpaRepository即可 不需要对 DAO 接口做任何实现, 实际上 spring 会调用 SimpleJpaRepository 实现 struts 2 注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值