Oracle merge合并更新函數(shù)實例詳解
前言
MERGE語句是Oracle9i新增的語法,用來合并UPDATE和INSERT語句。 通過MERGE語句,根據(jù)一張表或多表聯(lián)合查詢的連接條件對另外一張表進行查詢,連接條件匹配上的進行UPDATE,無法匹配的執(zhí)行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執(zhí)行效率要高于INSERT+UPDATE。通過這個MERGE你能夠在一個SQL語句中對一個表同時執(zhí)行INSERT和UPDATE操作.
本博客介紹一下Oracle merge合并函數(shù),業(yè)務(wù)場景:新增數(shù)據(jù)的時候要先查詢數(shù)據(jù)庫是否已經(jīng)有改數(shù)據(jù),有數(shù)據(jù)就更新數(shù)據(jù),沒數(shù)據(jù)才新增數(shù)據(jù),這是很常見的業(yè)務(wù)場景,如果是用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ū)關(guān)聯(lián)信息 * @date 2019年2月21日上午11:17:10 * @return */ @RequestMapping("/batchSaveTipsAreaConfig") @ResponseBody public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) { List<ApprTipsRelatedModel> areaTipsList = new ArrayList<ApprTipsRelatedModel>(); //封裝批量更新的地區(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有空格導(dǎo)致的,所以使用merge函數(shù)不用隨便加空格,不然會報錯的
? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ?
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- 為Plesk PHP7啟用Oracle OCI8擴展方法總結(jié)
- Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解
- MySQL實現(xiàn)類似Oracle序列的方案
- 如何利用Oracle命令解決函數(shù)運行錯誤
- SELECT INTO 和 INSERT INTO SELECT 兩種表復(fù)制語句詳解(SQL數(shù)據(jù)庫和Oracle數(shù)據(jù)庫的區(qū)別)
- Oracle Index索引無效的原因與解決方法
- Oracle中sql語句(+)符號代表連接的使用講解
- 抽取oracle數(shù)據(jù)到mysql數(shù)據(jù)庫的實現(xiàn)過程
- Oracle導(dǎo)入導(dǎo)出數(shù)據(jù)的幾種方式
- oracle如何解鎖封鎖的賬號
相關(guān)文章
Oracle如何獲取數(shù)據(jù)庫系統(tǒng)的當(dāng)前時間
這篇文章主要介紹了Oracle如何獲取數(shù)據(jù)庫系統(tǒng)的當(dāng)前時間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Oracle定義DES加密解密及MD5加密函數(shù)示例
本節(jié)主要介紹了Oracle中定義DES加密解密及MD5加密函數(shù),感興趣的朋友可以參考下2014-08-08ORACLE數(shù)據(jù)庫日常維護知識點總結(jié)
這篇文章主要介紹了ORACLE數(shù)據(jù)庫日常維護知識點總結(jié),對于維護oracle數(shù)據(jù)庫的朋友可以參考下2016-06-06