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

所属分类: 数据库 / oracle 阅读数: 1556
收藏 0 赞 0 分享

前言

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 ? ? ?) ? 

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

更多精彩内容其他人还在看

oracle(plsql)生成流水号

这篇文章主要介绍了oracle(plsql)生成流水号,需要的朋友可以参考下
收藏 0 赞 0 分享

oracle中decode函数的使用方法

这篇文章主要介绍了oracle中decode函数的使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Oracle数据远程连接的四种设置方法和注意事项

Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍
收藏 0 赞 0 分享

oracle表空间中空表统计方法示例介绍

这篇文章主要介绍了oracle表空间中空表统计方法,需要的朋友可以参考下
收藏 0 赞 0 分享

oracle用户权限、角色管理详解

这篇文章主要介绍了oracle用户权限、角色管理的使用和示例,需要的朋友可以参考下
收藏 0 赞 0 分享

oracle用户权限管理使用详解

这篇文章主要介绍了oracle用户权限管理使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

oracle生成动态前缀且自增号码的函数分享

这篇文章主要介绍了oracle生成动态前缀且自增号码的函数,需要的朋友可以参考下
收藏 0 赞 0 分享

45个非常有用的 Oracle 查询语句小结

这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧
收藏 0 赞 0 分享

oracle监控某表变动触发器例子(监控增,删,改)

这篇文章主要介绍了oracle监控某表变动触发器例子(监控增,删,改),用于监控某表的变动并生成日志记录到另一个表,需要的朋友可以参考下
收藏 0 赞 0 分享

oracle 数据库隔离级别学习

这篇文章主要介绍了oracle数据库的隔离级别相关的知识,数据库操作的隔离级别,有需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多