Oracle merge合并更新函数实例详解
前言
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){ ListareaTipsList=newArrayList (); //封装批量更新的地区列表 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???)?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。