Oraclemerge合并更新函数实例详解 您所在的位置:网站首页 oracle查询当前实例 Oraclemerge合并更新函数实例详解

Oraclemerge合并更新函数实例详解

#Oraclemerge合并更新函数实例详解| 来源: 网络整理| 查看: 265

前言

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

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

merge函数的语法:

MERGEINTOtable_namealias1 USING(table|view|sub_query)alias2 ON(joincondition) WHENMATCHEDTHEN UPDATEtable_name SETcol1=col_val1, col2=col_val2 WHENNOTMATCHEDTHEN INSERT(column_list)VALUES(column_values);

举个例子:

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

MERGEINTOt_config_relatedA1USING(select'97547758-6f85-419e-85f9-b8f711ca2660'seq, '97547758-6f85-419e-85f9-b8f711ca2658'tipsSeq, to_number('1')appLevel, '24e1ccc38d9542189d1cc6c23f814a18'relaSeqfromdual)A2 ON(A1.seq=A2.seq) WHENMATCHEDTHEN UPDATESET A1.tips_seq=A2.tipsSeq, A1.app_level=A2.appLevel, A1.rela_seq=A2.relaSeq WHENNOTMATCHEDTHEN INSERT(seq,tips_seq,app_level,rela_seq) VALUES(A2.seq,A2.tipsSeq,A2.appLevel,A2.relaSeq); /** *批量更新保存地区关联信息 *@date2019年2月21日上午11:17:10 *@return */ @RequestMapping("/batchSaveTipsAreaConfig") @ResponseBody publicResultModelbatchSaveTipsConfig(ApprTipsRelatedModelrelatedModel){ ListApprTipsRelatedModelareaTipsList=newArrayListApprTipsRelatedModel(); //封装批量更新的地区列表 String[]areaSeqs=StringUtils.split(relatedModel.getAreaSeq(),","); for(StringareaSeq:areaSeqs){ ApprTipsRelatedModelareaRelatedModelNew=newApprTipsRelatedModel(); 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); returnResultModel.success("保存成功"); }catch(Exceptione){ logger.error("批量绑定地区异常:{}"+e); thrownewSuperControllerException(); } }

注意要点:

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

Preparing:MERGEINTOappr_tips_config_relatedA1?USING(?????select?seq,?tipsSeq,?appLevel,?relaSeqfromdual????)A2?ON(?????A1.seq=A2.seq???)?WHENMATCHEDTHEN??UPDATESETA1.seq=A2.seq,A1.tips_seq=A2.tipsSeq,A1.app_level=A2.appLevel,A1.rela_seq=A2.relaSeq???WHENNOTMATCHEDTHEN???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,?relaSeqfromdual????)A2?ON(?????A1.seq=A2.seq???)?

总结

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

您可能感兴趣的文章:为PleskPHP7启用OracleOCI8扩展方法总结Mapper批量插入Oracle数据@InsertProvider注解MySQL实现类似Oracle序列的方案如何利用Oracle命令解决函数运行错误SELECTINTO和INSERTINTOSELECT两种表复制语句详解(SQL数据库和Oracle数据库的区别)OracleIndex索引无效的原因与解决方法Oracle中sql语句(+)符号代表连接的使用讲解抽取oracle数据到mysql数据库的实现过程Oracle导入导出数据的几种方式oracle如何解锁封锁的账号


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有