佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Oracle merge合并更新函數(shù)實例詳解

Oracle merge合并更新函數(shù)實例詳解

熱門標簽:Linux服務器 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 百度競價排名 呼叫中心市場需求 地方門戶網(wǎng)站 服務外包 AI電銷

前言

MERGE語句是Oracle9i新增的語法,用來合并UPDATE和INSERT語句。 通過MERGE語句,根據(jù)一張表或多表聯(lián)合查詢的連接條件對另外一張表進行查詢,連接條件匹配上的進行UPDATE,無法匹配的執(zhí)行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執(zhí)行效率要高于INSERT+UPDATE。通過這個MERGE你能夠在一個SQL語句中對一個表同時執(zhí)行INSERT和UPDATE操作.

本博客介紹一下Oracle merge合并函數(shù),業(yè)務場景:新增數(shù)據(jù)的時候要先查詢數(shù)據(jù)庫是否已經(jīng)有改數(shù)據(jù),有數(shù)據(jù)就更新數(shù)據(jù),沒數(shù)據(jù)才新增數(shù)據(jù),這是很常見的業(yè)務場景,如果是用Oracle數(shù)據(jù)庫的話,其實直接用merge函數(shù)效率更快,而且merge函數(shù)性能也相對比較好

merge函數(shù)的語法:

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實現(xiàn),意思是有數(shù)據(jù)就更新,沒數(shù)據(jù)才新增

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);
/**
  * 批量更新保存地區(qū)關聯(lián)信息
  * @date 2019年2月21日上午11:17:10
  * @return
  */
 
 @RequestMapping("/batchSaveTipsAreaConfig")
 @ResponseBody
 public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) {
 
  ListApprTipsRelatedModel> areaTipsList = new ArrayListApprTipsRelatedModel>();
 
  //封裝批量更新的地區(qū)列表
 
  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);
 
 }
 
  //批量更新新增數(shù)據(jù)
 
  try {
 
   this.tipsConfigService.batchSaveTipsRelatedConfig(areaTipsList);
 
   return ResultModel.success("保存成功");
 
  } catch(Exception e) {
 
   logger.error("批量綁定地區(qū)異常:{}"+e);
 
   throw new SuperControllerException();
 
  }
 
 }

注意要點:

在開發(fā)中我遇到一個異常,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函數(shù)不用隨便加空格,不然會報錯的

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

總結(jié)

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

您可能感興趣的文章:
  • 為Plesk PHP7啟用Oracle OCI8擴展方法總結(jié)
  • Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解
  • MySQL實現(xiàn)類似Oracle序列的方案
  • 如何利用Oracle命令解決函數(shù)運行錯誤
  • SELECT INTO 和 INSERT INTO SELECT 兩種表復制語句詳解(SQL數(shù)據(jù)庫和Oracle數(shù)據(jù)庫的區(qū)別)
  • Oracle Index索引無效的原因與解決方法
  • Oracle中sql語句(+)符號代表連接的使用講解
  • 抽取oracle數(shù)據(jù)到mysql數(shù)據(jù)庫的實現(xiàn)過程
  • Oracle導入導出數(shù)據(jù)的幾種方式
  • oracle如何解鎖封鎖的賬號

標簽:衡水 湘潭 崇左 蘭州 銅川 仙桃 湖南 黃山

巨人網(wǎng)絡通訊聲明:本文標題《Oracle merge合并更新函數(shù)實例詳解》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    广昌县| 黔江区| 江陵县| 甘肃省| 蒙自县| 滕州市| 西峡县| 赞皇县| 黄平县| 德兴市| 遵化市| 郸城县| 湘乡市| 松原市| 琼海市| 和田县| 浮梁县| 义乌市| 璧山县| 宕昌县| 兰州市| 澳门| 鲜城| 南通市| 浙江省| 扬中市| 天等县| 铜陵市| 郓城县| 绥芬河市| 商都县| 新龙县| 安化县| 麻阳| 仲巴县| 章丘市| 唐海县| 平遥县| 武义县| 弋阳县| 通山县|