欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle merge合并更新函数实例详解

程序员文章站 2023-02-25 08:56:06
前言 merge语句是oracle9i新增的语法,用来合并update和insert语句。 通过merge语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连...

前言

merge语句是oracle9i新增的语法,用来合并update和insert语句。 通过merge语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行update,无法匹配的执行insert。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于insert+update。通过这个merge你能够在一个sql语句中对一个表同时执行insert和update操作.

本博客介绍一下oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用oracle数据库的话,其实直接用merge函数效率更快,而且merge函数性能也相对比较好

merge函数的语法:

merge into table_name alias1 
using (table|view|sub_query) alias2
on (join condition) 
when matched then 
 update table_name 
 set col1 = col_val1, 
   col2 = col_val2 
when not matched then 
 insert (column_list) values (column_values); 

举个例子:

sql实现,意思是有数据就更新,没数据才新增

merge into t_config_related a1 using(select '97547758-6f85-419e-85f9-b8f711ca2660' seq,
   '97547758-6f85-419e-85f9-b8f711ca2658' tipsseq,
   to_number('1') applevel,
   '24e1ccc38d9542189d1cc6c23f814a18' relaseq from dual) a2
on(a1.seq = a2.seq)
when matched then
update set
  a1.tips_seq = a2.tipsseq,   
  a1.app_level = a2.applevel,
  a1.rela_seq = a2.relaseq
when not matched then
insert(seq , tips_seq , app_level , rela_seq)
values(a2.seq , a2.tipsseq , a2.applevel , a2.relaseq);
/**
  * 批量更新保存地区关联信息
  * @date 2019年2月21日上午11:17:10
  * @return
  */
 
 @requestmapping("/batchsavetipsareaconfig")
 @responsebody
 public resultmodel batchsavetipsconfig(apprtipsrelatedmodel relatedmodel) {
 
  list<apprtipsrelatedmodel> areatipslist = new arraylist<apprtipsrelatedmodel>();
 
  //封装批量更新的地区列表
 
  string[] areaseqs = stringutils.split(relatedmodel.getareaseq(),",");
 
  for (string areaseq : areaseqs) {
 
   apprtipsrelatedmodel arearelatedmodelnew = new apprtipsrelatedmodel();
 
   arearelatedmodelnew.setseq(commonservice.generateuuid());
 
   arearelatedmodelnew.settipsseq(relatedmodel.gettipsseq());
 
   arearelatedmodelnew.setapplevel(numconstant.common_num_tree);
 
   arearelatedmodelnew.setrelaseq(areaseq);
 
   areatipslist.add(arearelatedmodelnew);
 
 }
 
  //批量更新新增数据
 
  try {
 
   this.tipsconfigservice.batchsavetipsrelatedconfig(areatipslist);
 
   return resultmodel.success("保存成功");
 
  } catch(exception e) {
 
   logger.error("批量绑定地区异常:{}"+e);
 
   throw new supercontrollerexception();
 
  }
 
 }

注意要点:

在开发中我遇到一个异常,mybatis打印出来的sql是这样的:

preparing: merge into appr_tips_config_related a1 ? using( ? ? ? ? ? select ? seq , ? tipsseq , ? applevel , ? relaseq from dual ? ? ? ? ) a2 ? on( ? ? ? ? ?a1.seq = a2.seq ? ? ?) ? when matched then ? ? update set a1.seq = a2.seq, a1.tips_seq = a2.tipsseq, a1.app_level = a2.applevel, a1.rela_seq = a2.relaseq ? ? ?when not matched then ? ? ?insert(seq,tip_seq,app_level,rela_seq) ? ? ? ? values(a2.seq , a2.tipsseq , a2.applevel , a2.relaseq) 

可以看出什么问题?打印出的sql有很多问号,那是因为sql有空格导致的,所以使用merge函数不用随便加空格,不然会报错的

? using( ? ? ? ? ? select ? seq , ? tipsseq , ? applevel , ? relaseq from dual ? ? ? ? ) a2 ? on( ? ? ? ? ?a1.seq = a2.seq ? ? ?) ? 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。