1. 程式人生 > 資料庫 >Oracle merge合併更新函式例項詳解

Oracle merge合併更新函式例項詳解

前言

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.rela_seq = A2.relaSeq ? ? ?WHEN NOT MATCHED THEN ? ? ?INSERT(seq,tip_seq,rela_seq) ? ? ? ? VALUES(A2.seq,A2.relaSeq) 

可以看出什麼問題?打印出的SQL有很多問號,那是因為SQL有空格導致的,所以使用merge函式不用隨便加空格,不然會報錯的

? USING( ? ? ? ? ? select ? seq,? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。