postgresql 存储过程 批量插入(根据插入的值 动态判断需要插入的字段) 以及 批量更改(根据更改的值 动态判断需要更改的字段)

postgresql 存储过程
循环插入 根据插入的值判断插入相应的字段

在PostgreSQL中,您可以使用PL/pgSQL语言编写函数,该函数可以在循环中执行插入操作,并根据插入的值判断应该插入哪些字段。但是,请注意,PostgreSQL通常不支持动态字段插入,因为表的结构是固定的。您通常需要在插入时提供所有字段的值,即使某些字段是NULL。

不过,您可以通过逻辑判断来确保只插入非NULL或符合特定条件的值。以下是一个示例函数,它使用循环来插入数据,并根据条件判断哪些字段应该被包含在INSERT语句中:

CREATE OR REPLACE FUNCTION loop_insert_based_on_value()  
RETURNS void AS 
$$
  
DECLARE  
    row_record RECORD; -- 用于存储从源表读取的行  
    should_insert_field1 BOOLEAN := false;  
    should_insert_field2 BOOLEAN := false;  
    should_insert_field3 BOOLEAN := false;  
BEGIN  
    -- 假设我们有一个源表source_data,从中读取数据  
    FOR row_record IN SELECT * FROM source_data LOOP  
        -- 根据row_record中的值判断哪些字段应该被插入  
        IF row_record.some_column IS NOT NULL AND row_record.some_column > 10 THEN  
            should_insert_field1 := true;  
        END IF;  
        IF row_record.another_column = 'value' THEN  
            should_insert_field2 := true;  
        END IF;  
        -- 添加更多条件判断...  
  
        -- 构建INSERT语句,只包含需要插入的字段  
        INSERT INTO target_table (  
            field1,  
            field2,  
            field3  
        ) VALUES (  
            CASE WHEN should_insert_field1 THEN row_record.value_for_field1 ELSE NULL END,  
            CASE WHEN should_insert_field2 THEN row_record.value_for_field2 ELSE NULL END,  
            CASE WHEN should_insert_field3 THEN row_record.value_for_field3 ELSE NULL END  
        );  
  
        -- 重置字段插入标志,为下一次循环做准备  
        should_insert_field1 := false;  
        should_insert_field2 := false;  
        should_insert_field3 := false;  
    END LOOP;  
END;  

$$
 LANGUAGE plpgsql;

在这个函数中,我们首先声明了一些变量来跟踪哪些字段应该被插入。然后,我们使用一个FOR循环来遍历源表source_data中的每一行。对于每一行,我们检查某些条件,并设置相应的标志变量。最后,我们构建一个INSERT语句,只包括那些其标志变量为TRUE的字段。我们使用CASE语句在INSERT中为这些字段提供值,或者如果不需要插入该字段,则提供NULL。

请注意,这个示例假设source_data表中包含用于决定哪些字段应该被插入的列(如some_column和another_column),以及用于插入到target_table中的实际值(如value_for_field1,value_for_field2和value_for_field3)。您需要根据您的实际表结构和业务需求来调整这些列名。

此外,虽然这种方法可以实现基于值的字段插入,但它并不是最优的,因为它在每次循环迭代时都执行一个完整的INSERT语句。如果可能,最好优化您的数据库模式或业务逻辑,以避免这种动态字段插入的需求。

实战sql,批量新增

CREATE OR REPLACE PROCEDURE public.data_read_zao0070(p_org_id integer, p_uid character varying, p_user_id character varying)
 LANGUAGE plpgsql
AS $procedure$
DECLARE
  p_result_count integer;
  current_row RECORD;  
  current_row2 RECORD;  
  current_rows varchar[];
  current_value varchar;
 
 -- 定义判断需要增加的字段,为true需要增加,false不需要增加。
inventory_used_field1 BOOLEAN := false;  
inventory_used_amount_field2 BOOLEAN := false;  
inventory_nonused_field3 BOOLEAN := false;  
inventory_nonused_amount_field4 BOOLEAN := false;  


	-- 循环插入				
			FOR current_row2 IN  (select
					m.* 
					from
						plant_if_sap_zao0070 m
					where
						not exists (
							select
								*
							from
								plant_actual p
							where
								m.del_flag = '0'
								and p.del_flag = '0'
								and trim(m.m_code) = trim(p.m_code)
								and 
								to_char((date_trunc('MONTH', to_date(m.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   
								= p.plt_shp_dt
								and 
								to_char((date_trunc('MONTH', to_date(m.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   
								= p.shipping_dt)
						and exists (
							select
								*
							from
								plant_m_model mo
							where
								mo.del_flag = '0'
								and m.del_flag = '0'
								and trim(mo.m_code) = trim(m.m_code))
								and m.org_id = p_org_id) LOOP				

				IF trim(current_row2.warehouse_code) = 'BLK' THEN  
		           inventory_nonused_field3 := true;  
		           inventory_nonused_amount_field4 := true;  
		        END IF; 
		       	IF trim(current_row2.warehouse_code) = 'URG' THEN  
		           inventory_used_field1  := true;  
		           inventory_used_amount_field2  := true;  
		        END IF; 

		        raise notice '++++++++++ ';
		        raise notice '标记: [%] ',inventory_nonused_field3;
		        raise notice '标记: [%] ',inventory_nonused_amount_field4;
		        raise notice '标记: [%] ',inventory_used_field1;
		        raise notice '标记: [%] ',inventory_used_amount_field2;
		        raise notice '++++++++++ ';

		       INSERT INTO public.plant_actual
				(	
				org_id, m_code, bo_code, plt_shp_dt, shipping_dt, currency, 
				inventory_used, inventory_used_amount, inventory_nonused, inventory_nonused_amount,
				create_by, modify_by
				)values(
			        p_org_id,
					trim(current_row2.m_code),
					null,
				    to_char((date_trunc('MONTH', to_date(current_row2.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD'),
				    to_char((date_trunc('MONTH', to_date(current_row2.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD'),
				    'CNY',
				    CASE WHEN inventory_used_field1 THEN CAST(CONCAT(current_row2.q_qty_sign,current_row2.q_qty_number) AS NUMERIC)  ELSE NULL END,  
				    CASE WHEN inventory_used_amount_field2 THEN  CAST(CONCAT(current_row2.q_amount_sign,current_row2.q_amount_number, '.', current_row2.q_amount_point) AS NUMERIC) ELSE NULL END,  
				    CASE WHEN inventory_nonused_field3 THEN  CAST(CONCAT(current_row2.r_qty_sign,current_row2.r_qty_number) AS NUMERIC) ELSE NULL END,  
				    CASE WHEN inventory_nonused_amount_field4 THEN CAST(CONCAT(current_row2.r_amount_sign,current_row2.r_amount_number, '.', current_row2.r_amount_point) AS NUMERIC) ELSE NULL END,  
					p_user_id,
					p_user_id 
			);		
		
		-- 循环结束 重置变量
		        inventory_used_field1 := false;  
		        inventory_used_amount_field2 := false;  
			    inventory_nonused_field3 := false;  
				inventory_nonused_amount_field4 := false;  				
			END LOOP;  

实战sql,批量更新 具体逻辑 思路仿照上面新增的思路

CREATE OR REPLACE PROCEDURE public.data_read_zao0070(p_org_id integer, p_uid character varying, p_user_id character varying)
 LANGUAGE plpgsql
AS $procedure$
DECLARE
  p_result_count integer;
  current_row RECORD;  
  current_row2 RECORD;  
  current_rows varchar[];
  current_value varchar;
 
inventory_used_field1 BOOLEAN := false;  
inventory_used_amount_field2 BOOLEAN := false;  
inventory_nonused_field3 BOOLEAN := false;  
inventory_nonused_amount_field4 BOOLEAN := false;  

 	FOR current_row IN  (
				  select 
						m.* 
						from
							plant_if_sap_zao0070 m
						where
					 		exists (
								select
									*
								from
									plant_actual p
								where
									m.del_flag = '0'
									and p.del_flag = '0'
									and trim(m.m_code) = trim(p.m_code)
									and p.plt_shp_dt =  
									to_char((date_trunc('MONTH', to_date(m.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   
									and p.shipping_dt = 
									to_char((date_trunc('MONTH', to_date(m.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   
								)
							and exists (
								select
									*
								from
									plant_m_model mo
								where
									mo.del_flag = '0'
									and m.del_flag = '0'
									and trim(mo.m_code) = trim(m.m_code))
									and m.org_id = p_org_id				
						) LOOP 
						
				 raise notice '更改数据 : [%] ',current_row;						
						
				IF trim(current_row.warehouse_code) = 'BLK' THEN  
		           inventory_nonused_field3 := true;  
		           inventory_nonused_amount_field4 := true;  
		        END IF; 
		       	IF trim(current_row.warehouse_code) = 'URG' THEN  
		           inventory_used_field1  := true;  
		           inventory_used_amount_field2  := true;  
		        END IF; 
								
		        raise notice '--------- ';
		        raise notice '标记: [%] ',inventory_nonused_field3;
		        raise notice '标记: [%] ',inventory_nonused_amount_field4;
		        raise notice '标记: [%] ',inventory_used_field1;
		        raise notice '标记: [%] ',inventory_used_amount_field2;
		        raise notice '--------- ';
				
		    UPDATE public.plant_actual
				SET 
				inventory_used=
				CASE WHEN inventory_used_field1 THEN 
				CAST(CONCAT(current_row.q_qty_sign,current_row.q_qty_number) AS NUMERIC)  ELSE NULL END,  
				inventory_used_amount=
				CASE WHEN inventory_used_amount_field2 THEN  CAST(CONCAT(current_row.q_amount_sign,current_row.q_amount_number, '.', current_row.q_amount_point) AS NUMERIC) ELSE NULL END,  
				inventory_nonused=
				CASE WHEN inventory_nonused_field3 THEN  CAST(CONCAT(current_row.r_qty_sign,current_row.r_qty_number) AS NUMERIC) ELSE NULL END,  
				inventory_nonused_amount=
				CASE WHEN inventory_nonused_amount_field4 THEN CAST(CONCAT(current_row.r_amount_sign,current_row.r_amount_number, '.', current_row.r_amount_point) AS NUMERIC) ELSE NULL END,  
				modify_by=p_user_id
				WHERE trim(m_code)=trim(current_row.m_code) 
				AND plt_shp_dt = 
				to_char((date_trunc('MONTH', to_date(current_row.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   
				and shipping_dt = 
				to_char((date_trunc('MONTH', to_date(current_row.stock_years, 'YYYYMM') + interval '1 month') - interval '1 day')::date, 'YYYY-MM-DD')   	
			    and del_flag='0' and  org_id=p_org_id;	
			
			-- 增加一步修改状态为1
			update plant_if_sap_zao0070 set del_flag = '1'
			where trim(m_code) = trim(current_row.m_code) and org_id = p_org_id;

	  		inventory_used_field1 := false;  
	        inventory_used_amount_field2 := false;  
		    inventory_nonused_field3 := false;  
			inventory_nonused_amount_field4 := false;  	
		
 END LOOP; 	

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

indexDB 大图缓存

背景 最近在项目中遇到了一个问题:由于大屏背景图加载速度过慢,导致页面黑屏时间过长,影响了用户的体验。从下图可以看出加载耗时将近一分钟 IndexDB 主要的想法就是利用indexDB去做缓存,优化加载速度;在这之前&am…

VNISEdit 制作安装包

1. 环境依赖 1.1. NSIS 下载 下载地址:https://nsis.sourceforge.io/Download 1.2. VNISEdit 下载 下载地址1:https://sourceforge.net/projects/hmne/ 下载 exe 安装。 下载地址2:https://hmne.sourceforge.net/ 可以下载 exe 安装。也…

基础算法---前缀和

文章目录 基本思想1.前缀和2.子矩阵的和3.长度最小的子数组4,除自身以外数组的乘积总结 基本思想 前缀和数组就是一个数组的前i项和 前缀和的用处:前缀和数组求出来之后我们就可以就可以求数组中的某个特定区间的和 就比如说求l到R的和,我…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态,给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

网站想实现HTTPS访问需要有哪些步骤?

网站要实现HTTPS访问,以确保数据传输安全和提升用户信任度,主要需按以下步骤操作: 1. 购买或申请SSL证书: - 根据网站类型和需求,选择合适的SSL证书:DV(域名验证)、OV(组…

Maxwell安装使用和简单案例

一、解压 cd /opt/software/ ​ tar -zxvf maxwell-1.29.2.tar.gz -C /opt/module/ ​ cd /opt/module/ 二、MySQL 环境准备 1、修改 mysql 的配置文件 修改 mysql 的配置文件,开启 MySQL Binlog 设置 vi /etc/my.cnf 添加以下内容 server_id1 log-binmysql-…

冈萨雷斯数字图像处理资源(课后习题答案+代码+图片)

冈萨雷斯数字图像处理相关资源整理,资源全部来源互联网,方便大家下载 冈萨雷斯数字图像处理相关资源整理 课后习题 冈萨雷斯数字图像处理源代码

etcd campaign

1. 引言 本文主要讲解使用etcd进行选举的流程,以及对应的缺陷和使用场景 2. etcd选举流程 流程如以代码所示,流程为: clientv3.New 创建client与etcd server建立连接 concurrency.NewSession 创建选举的session,一般会配置ses…

微信小程序一到六章总结

第一章总结 认识微信小程序 小程序简介 微信(WeChat) 是腾讯公司于2011年1月21 日推出的一款为智能终端提供即时通信服务的应用程序。 小程序、订阅号、服务号、企业微信(企业号)属于微信公众平台的四大生态体系,它们面向不同的用户群体&…

Harmony OS应用开发性能优化全面指南

优化应用性能对于应用开发至关重要。通过高性能编程、减少丢帧卡顿、提升应用启动和响应速度,可以有效提升用户体验。本文将介绍一些优化应用性能的方法,以及常用的性能调优工具。 ArkTS高性能编程 为了提升代码执行速度,进而提升应用整体性…

若依如何去掉“正在加载系统资源,请耐心等待”

最近有网友反馈这个加载动画很丑,问我如何去掉: 首先找到前端页面的index.html文件,去掉或注释掉如下代码:

使用Gitee进行社交登录的流程

使用Gitee进行社交登录 创建Gitee第三方应用流程: 鼠标移动到个人头像上,点击账号设置 点击账号设置,选择左边目录下数据管理的第三方应用 然后选择创建应用 根据要求填写 填写好了上面的要求之后,点击创建应用,这样&…

【Java】如何获取客户端IP地址

在项目中往往涉及到“获取客户端IP地址”,常见到下面这样子的代码: package com.utils;import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.reactive.ServerHttpRequest; import java.net…

前端JS必用工具【js-tool-big-box】,获取浏览器参数、cookie、localStorage的存取

这一小节,我们针对js-tool-big-box工具做一些使用讲解,主要获取浏览器参数、cookie、localStorage的存取方面的。 这些方法差不多每次项目中要么用不到,要么就自己写一份,轮子造的很重复啊,而且localStorage有时候要求…

牛客网:环形链表的约瑟夫问题

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 目录 🏝1.问题描述: 🏝2.实现代码: 🏝1.问题描述: 前言&am…

windows系统CUDA的详细安装教程

CUDA系列 文章目录 CUDA系列前言一、CUDA简介二、安装配置视频教程三、CUDA的下载及安装3.1 环境检查3.2 CUDA 安装包下载3.3 安装CUDA(略)3.4 验证CUDA是否安装成功 四、cuDNN的下载及安装4.1 cuDNN下载4.2 cuDNN配置 五、配置环境变量六、下载并配置zl…

springboot 集成 i18n实现国际化信息返回 实现中英文切换 实现网站支持多语言切换

还是直接上代码 目前实现了 中英文 返回 别的语言 都差不多 主要用spring boot 自带的 类实现的 不用引入任何 依赖 使用的就是下面的类 org.springframework.context.MessageSource 是 Spring Framework 中用于支持国际化(Internationalization,简称 i…

把 WordPress 变成 BaaS 服务:API 调用指南

有了前面两篇内容的铺垫,我们来聊聊 WordPress 作为 CMS / BaaS 服务使用时绕不开的问题,API 调用。 这篇内容同样的,会尽量少贴代码,简单的讲清楚一件事,降低阅读负担。 写在前面 首先,我们需要进行清晰…

使用autocannon和0x对网站进行性能分析(node)

npm i autocannon -g autocannon -c 100 -d 5 -p 10 http://localhost:3000/ 0x -o app.js 火焰图是根据程序的栈的状态对出现函数的采样数据统计而得,宽度代表函数运行一次所需的时长、高度代表栈的层数、颜色深度代表函数在采样中出现的频率,因此宽度…

手摸手教你把Ingress Nginx集成进Skywalking

背景 在微服务大行其道的今天,如何观测众多微服务、快速理清服务间的依赖、如何对服务之间的调用性能进行衡量,成了摆在大家面前的难题。对此,Skywalking应运而生,它是托管在 Apache 基金会下的开源项目,旨在帮助开发…
最新文章