PostgreSQL根据查询结果执行插入或更新操作

最近需要把老项目中Oracle语法改为pg的,其中一个逻辑为导入Excel数据,根据数据的唯一标识做插入或者更新操作,数据库中有此数据,则执行更新,反之插入。

Oracle代码:

	declare
    v_count    number;
    
    begin
    	select count(1) into v_count from uns_author_manage a where a.author_no = #AUTHOR_NO#;
		<![CDATA[
		if v_count = 0 then
			insert into uns_author_manage
			  (id,
			   author_no,
			   author_type,
			   project_name,
			   project_property,
			   application_com,
			   valid,
			   bid_invitation,
			   estimate_coverage,
			   estimate_ppremium,
			   author_person_name,
			   author_pseson_job,
			   operator,
			   operator_name,
			   create_date
			   )
			   
			values(
			   seq_uns_author_manage.nextval
			   ,nvl(#AUTHOR_NO#,'')
			   ,nvl(#AUTHOR_TYPE#,'')
			   ,nvl(#PROJECT_NAME#,'')
			   ,nvl(#PROJECT_PROPERTY#,'')
			   ,nvl(#APPLICATION_COM#,'')
			   ,nvl(#VALID#,'')
			   ,nvl(#BID_INVITATION#,'')
			   ,nvl(#ESTIMATE_COVERAGE#,'')
			   ,nvl(#ESTIMATE_PPREMIUM#,'')
			   ,nvl(#AUTHOR_PERSON_NAME#,'')
			   ,nvl(#AUTHOR_PSESON_JOB#,'')
			   ,nvl(#USERID#,'')
			   ,nvl(#OPERATOR_NAME#,'')
			   ,sysdate);
		else
			update uns_author_manage
			   set author_type = nvl(#AUTHOR_TYPE#,'')
				   ,project_name = nvl(#PROJECT_NAME#,'')
				   ,project_property = nvl(#PROJECT_PROPERTY#,'')
				   ,application_com = nvl(#APPLICATION_COM#,'')
				   ,valid = nvl(#VALID#,'')
				   ,bid_invitation = nvl(#BID_INVITATION#,'')
				   ,estimate_coverage = nvl(#ESTIMATE_COVERAGE#,'')
				   ,estimate_ppremium = nvl(#ESTIMATE_PPREMIUM#,'')
				   ,author_person_name = nvl(#AUTHOR_PERSON_NAME#,'')
				   ,author_pseson_job = nvl(#AUTHOR_PSESON_JOB#,'')
				   ,operator = nvl(#USERID#,'')
				   ,operator_name = nvl(#OPERATOR_NAME#,'')
				   ,update_date = sysdate
			   where author_no = #AUTHOR_NO#;
		end if;
		]]>
	end;

改为pg代码:

			insert into uns_author_manage
			  (
			   author_no,
			   author_type,
			   project_name,
			   project_property,
			   application_com,
			   valid,
			   bid_invitation,
			   estimate_coverage,
			   estimate_ppremium,
			   author_person_name,
			   author_pseson_job,
			   operator,
			   operator_name,
			   create_date
			   )
			values(
				coalesce(#AUTHOR_NO#)
			   ,coalesce(#AUTHOR_TYPE#)
			   ,coalesce(#PROJECT_NAME#)
			   ,coalesce(#PROJECT_PROPERTY#)
			   ,coalesce(#APPLICATION_COM#)
			   ,coalesce(#VALID#)
			   ,coalesce(#BID_INVITATION#)
			   ,coalesce(#ESTIMATE_COVERAGE#)
			   ,coalesce(#ESTIMATE_PPREMIUM#)
			   ,coalesce(#AUTHOR_PERSON_NAME#)
			   ,coalesce(#AUTHOR_PSESON_JOB#)
			   ,coalesce(#USERID#)
			   ,coalesce(#OPERATOR_NAME#)
			   ,now())
				 ON conflict(author_no)
				 DO update set 
			      author_type = coalesce(#AUTHOR_TYPE#)
				   ,project_name = coalesce(#PROJECT_NAME#)
				   ,project_property = coalesce(#PROJECT_PROPERTY#)
				   ,application_com = coalesce(#APPLICATION_COM#)
				   ,valid = coalesce(#VALID#)
				   ,bid_invitation = coalesce(#BID_INVITATION#)
				   ,estimate_coverage = coalesce(#ESTIMATE_COVERAGE#)
				   ,estimate_ppremium = coalesce(#ESTIMATE_PPREMIUM#)
				   ,author_person_name = coalesce(#AUTHOR_PERSON_NAME#)
				   ,author_pseson_job = coalesce(#AUTHOR_PSESON_JOB#)
				   ,operator = coalesce(#USERID#)
				   ,operator_name = coalesce(#OPERATOR_NAME#)
				   ,update_date = now();

不过要注意下,被conflict()函数修饰的键要具有唯一索引,否则会报错,使用以下代码创建唯一索引:

alter table uns_author_manage add constraint id_cons unique(author_no);		
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素人岳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值