Oracle merge合并更新函數(shù)實(shí)例詳解
前言
MERGE語(yǔ)句是Oracle9i新增的語(yǔ)法,用來(lái)合并UPDATE和INSERT語(yǔ)句。 通過(guò)MERGE語(yǔ)句,根據(jù)一張表或多表聯(lián)合查詢的連接條件對(duì)另外一張表進(jìn)行查詢,連接條件匹配上的進(jìn)行UPDATE,無(wú)法匹配的執(zhí)行INSERT。這個(gè)語(yǔ)法僅需要一次全表掃描就完成了全部工作,執(zhí)行效率要高于INSERT+UPDATE。通過(guò)這個(gè)MERGE你能夠在一個(gè)SQL語(yǔ)句中對(duì)一個(gè)表同時(shí)執(zhí)行INSERT和UPDATE操作.
本博客介紹一下Oracle merge合并函數(shù),業(yè)務(wù)場(chǎng)景:新增數(shù)據(jù)的時(shí)候要先查詢數(shù)據(jù)庫(kù)是否已經(jīng)有改數(shù)據(jù),有數(shù)據(jù)就更新數(shù)據(jù),沒(méi)數(shù)據(jù)才新增數(shù)據(jù),這是很常見(jiàn)的業(yè)務(wù)場(chǎng)景,如果是用Oracle數(shù)據(jù)庫(kù)的話,其實(shí)直接用merge函數(shù)效率更快,而且merge函數(shù)性能也相對(duì)比較好
merge函數(shù)的語(yǔ)法:
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);
舉個(gè)例子:
SQL實(shí)現(xiàn),意思是有數(shù)據(jù)就更新,沒(méi)數(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();
}
}
注意要點(diǎn):
在開(kāi)發(fā)中我遇到一個(gè)異常,mybatis打印出來(lái)的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)
可以看出什么問(wèn)題?打印出的SQL有很多問(wèn)號(hào),那是因?yàn)镾QL有空格導(dǎo)致的,所以使用merge函數(shù)不用隨便加空格,不然會(huì)報(bào)錯(cuò)的
? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ?
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 為Plesk PHP7啟用Oracle OCI8擴(kuò)展方法總結(jié)
- Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解
- MySQL實(shí)現(xiàn)類似Oracle序列的方案
- 如何利用Oracle命令解決函數(shù)運(yùn)行錯(cuò)誤
- SELECT INTO 和 INSERT INTO SELECT 兩種表復(fù)制語(yǔ)句詳解(SQL數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)的區(qū)別)
- Oracle Index索引無(wú)效的原因與解決方法
- Oracle中sql語(yǔ)句(+)符號(hào)代表連接的使用講解
- 抽取oracle數(shù)據(jù)到mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)過(guò)程
- Oracle導(dǎo)入導(dǎo)出數(shù)據(jù)的幾種方式
- oracle如何解鎖封鎖的賬號(hào)
相關(guān)文章
Oracle EBS工具選項(xiàng):關(guān)閉其他表單修改方法
這篇文章主要介紹了Oracle EBS工具選項(xiàng)關(guān)閉其他表單修改方法,包括通過(guò)SQL語(yǔ)句永久打開(kāi)或關(guān)閉這個(gè)選項(xiàng)的方法,需要的朋友可以了解下。2017-09-09
查詢Oracle中正在執(zhí)行和執(zhí)行過(guò)的SQL語(yǔ)句
這篇文章主要介紹了查詢Oracle中正在執(zhí)行和執(zhí)行過(guò)的SQL語(yǔ)句,需要的朋友可以參考下2016-10-10
Oracle日常維護(hù)中管理用戶以及重做日志文件的方法
這篇文章主要介紹了Oracle日常維護(hù)中管理用戶以及重做日志文件的方法,是Oracle入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-12-12
Oracle 11g收集多列統(tǒng)計(jì)信息詳解
我們?cè)趯?xiě)SQL語(yǔ)句的時(shí)候,有的時(shí)候會(huì)碰到where子句后面有多個(gè)條件的情況,也就是根據(jù)多列的條件篩選得到數(shù)據(jù)。下面這篇文章主要給大家介紹了Oracle 11g收集多列統(tǒng)計(jì)信息的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下。2017-03-03
oracle中行轉(zhuǎn)列LISTAGG()函數(shù)詳解及應(yīng)用實(shí)例
這篇文章主要給大家介紹了關(guān)于oracle中行轉(zhuǎn)列LISTAGG()函數(shù)詳解及應(yīng)用實(shí)例的相關(guān)資料,stagg是oracle11.2增加的特性,功能類似wmsys.wm_concat函數(shù),即將數(shù)據(jù)分組后,把指定列的數(shù)據(jù)通過(guò)指定符號(hào)合并,需要的朋友可以參考下2024-05-05
Oracle的SYS_GUID()函數(shù)用法及說(shuō)明
這篇文章主要介紹了Oracle的SYS_GUID()函數(shù)用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

