Oracle merge合並更新函數


本博客介紹一下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 ? ? ?) ? 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM