前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle merge合并更新函数案例分析

Oracle merge合并更新函数案例分析

作者头像
星哥玩云
发布2022-08-17 20:46:37
4390
发布2022-08-17 20:46:37
举报
文章被收录于专栏:开源部署开源部署

本文介绍一下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 ? ? ?) ?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档