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$
DECLAREp_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  (selectm.* fromplant_if_sap_zao0070 mwherenot exists (select*fromplant_actual pwherem.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_dtand 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*fromplant_m_model mowheremo.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$
DECLAREp_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.* fromplant_if_sap_zao0070 mwhereexists (select*fromplant_actual pwherem.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*fromplant_m_model mowheremo.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_actualSET 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_idWHERE 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;	-- 增加一步修改状态为1update 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.mzph.cn/news/827294.shtml

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

相关文章

FastWiki一分钟本地离线部署本地企业级人工智能客服

介绍 FastWiki是一个开源的企业级人工智能客服系统,它使用了一系列先进的技术和框架来支持其功能。 技术栈 前端框架:React LobeUI TypeScript后端框架:MasaFramework 基于 .NET 8动态函数:基于JavaScript V8引擎实现向量搜索…

物联网配网工具多元化助力腾飞——智能连接,畅享未来

随着物联网技术的迅猛发展,智能插座、蓝牙网关作为其中常见的智能物联设备,无论是功能还是外观都有很大的改进,在智能化越来越普遍的情况下,它们的应用场景也在不断拓宽。对于智能设备而言,配网方式的选择对于设备的成…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接: Download the latest package 第二步操作方式:打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

【Java框架】SpringMVC(二)——SpringMVC数据交互

目录 前后端数据交互RequestMapping注解基于RequestMapping注解设置接口的请求方式RequestMapping注解的常用属性一个方法配置多个接口method属性params属性headers属性consumes属性produces属性 SpringMVC中的参数传递默认单个简单参数默认多个简单参数默认参数中有基本数据类…

山与路远程控制 一个基于electron和golang实现的远控软件

山与路远程控制 🎥项目演示地址 还在制作… ♻️项目基本介绍 山与路远程控制是基于electron(vue3)和golang实现的远程控制软件(项目界面主要模仿向日葵远程软件,如有侵权请告知),代码可能有点臃肿毕竟只花了一周左右写的无聊项目,如果对其感兴趣的大佬可以fork自…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加,根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时,结果是一个新的向量,其方向垂直于这两个向量所在的平面,并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…

爱普生RX-8130CE内置电池控制 RTC

特点:(1)封装极小,集成度高RX-8130CE是一个带|2C接口的实时时钟模块,内部集成32.768KHz晶体振荡器。实时时钟功能不仅集成了年、月、日、星期、小时、分、秒的日历和时钟计数器,同时也有时间闹钟、间隔定时器、时间更新中断等功能…

算法练习|Leetcode49字母异位词分词 ,Leetcode128最长连续序列,Leetcode3无重复字符的最长子串,sql总结

目录 一、Leetcode49字母异位词分词题目描述解题思路方法:哈希总结 二、Leetcode128最长连续序列题目描述解题思路方法:总结 三、Leetcode3无重复字符的最长子串题目描述解题思路方法:双指针法总结sql总结 一、Leetcode49字母异位词分词 题目描述 给你一个字符串数组&#xf…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件(h264) 测试页面,直接使用cef_enhancement,里边带着的那个html即可,h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式,不过我的这个…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文,该公司在本论文中宣布的一种新的“越狱”技术,名为Many-shot Jailbreaking(多轮越狱)。文章详细描述了目前大语言模型(LLM&…

CMake 编译项目

一、概述 cmake 是C一个很重要的编译和项目管理工具,我们在git 上以及常见的项目现在多数都是用cmake 管理的,那么我们今天就做一个同时有Opencv和CGAL 以及PCL 的项目。 二、项目管理 重点是CMakeList.txt 1、CMakeList.txt cmake_minimum_requir…

Springboot3集成Web、RedisTemplate、Test和knife4j

本例将展示&#xff0c;如何在Springboot3中完成&#xff1a; Redis功能的Web接口实现构建Redis功能的单元测试knife4j自动化生成文档 Redis功能 Pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

windows SDK编程 --- 消息(3)

前置知识 一、消息的分类 1. 鼠标消息 处理与鼠标交互相关的事件&#xff0c;比如移动、点击和滚动等。例如&#xff1a; WM_MOUSEMOVE: 当鼠标在窗口客户区内移动时发送。WM_LBUTTONDOWN: 当用户按下鼠标左键时发送。WM_LBUTTONUP: 当用户释放鼠标左键时发送。WM_RBUTTOND…

区块链交易所技术开发架构解析 交易所开发团队

区块链交易所是加密货币市场中的关键基础设施之一&#xff0c;它提供了一个平台&#xff0c;让用户可以买卖各种数字资产。而搭建一个功能完善、安全可靠的交易所需要一个复杂的技术开发架构&#xff0c;以及一个协调配合的交易所开发团队。下面我们将分析交易所的技术架构以及…

Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)

警告&#xff1a;“学习排名 (Learning To Rank)” 功能处于技术预览版&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但此功能不受官方 GA 功能的支持 SLA 的约束。 注意&#xff1a;此功能是在版本 8.12.0 中引入的&#xff0c;并且仅适…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…

文件上传服务器、文件展示等异步问题

问题&#xff1a; 文件上传模块&#xff1a;当文件已经上传完成&#xff0c;文件进度已经走完了&#xff0c;但是服务器响应还没有返回结果&#xff0c;出现了&#xff0c;获取不到上传后的文件路径&#xff0c;需要等待服务器返回结果后&#xff0c;才能获取文件路径并点击跳…

excel中怎么用乘法、加法来替代AND和OR函数

你可以使用乘法和加法来替代Excel中的AND和OR函数&#xff0c;虽然这样做可能会增加公式的复杂度&#xff0c;但在某些情况下是可行的。 1. 使用乘法替代AND函数&#xff1a;AND函数用于判断一系列条件是否同时成立&#xff0c;如果所有条件都为TRUE&#xff0c;则返回TRUE&…

IOMMU和SMMU详解

前言&#xff1a; IOMMU&#xff08;输入输出内存管理单元&#xff09;的原理与CPU中的MMU&#xff08;内存管理单元&#xff09;相似。它的作用是管理设备的内存访问请求&#xff0c;允许安全、高效地在设备和内存之间直接传输数据。IOMMU通常用于支持高速数据传输的设备&…