• Oracle merge合并更新函數實例詳解

     更新時間:2019年02月24日 09:36:21   作者:smileNicky  
    這篇文章主要給大家介紹了關于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.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 ? ? ?) ? 

    總結

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

    相關文章

    最新評論

    美丽人妻被按摩中出中文字幕