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???)?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。