本博客介绍一下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 SETA1.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")@ResponseBodypublic 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 ? ? ?) ?

Oracle应用之merge合并更新函数相关推荐

  1. Oracle中的MERGE语句

    转自http://blog.chinaunix.net/space.php?uid=16981447&do=blog&cuid=430716 做了简单的格式整理,加入了一点点原创的东西 ...

  2. oracle拆分分区语法详解大全_学习笔记:Oracle分区表 添加 删除 合并 删除 交换 拆分等分区表的操作案例...

    天萃荷净 Oracle分区表管理,记录关于Oracle分区表的管理案例:创建.删除.合并.拆分.交换.更改分区表的操作方法 1.添加创建分区表 1.1)增加分区(add partition) 语法是: ...

  3. merge合并2个json文件

    merge合并2个json文件 功能 import { expect } from "chai"; import { createMerge } from "./merg ...

  4. git merge合并时遇上refusing to merge unrelated histories的解决方案

    如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-hi ...

  5. oracle中的merge into用法解析

    oracle中的merge into用法解析 merge into的形式 MERGE INTO [target-table] A USING [source-table sql] B ON([cond ...

  6. git常用命令+git规范(附merge合并及冲突解决)

    一.VCS版本控制系统 version control system(VCS),用于项目中存储.共享.合并.历史回退.代码追踪文件历史等功能. VCS软件: 2000年以前 2010年以前 2010年 ...

  7. Eclipse的Git插件Egit: merge合并冲突具体解决方法

    Eclipse的Git插件Egit: merge合并冲突具体解决方法 参考文章: (1)Eclipse的Git插件Egit: merge合并冲突具体解决方法 (2)https://www.cnblog ...

  8. Oracle多行记录合并/连接/聚合字符串的几种方法

    Oracle多行记录合并/连接/聚合字符串的几种方法 怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.   ...

  9. Pandas合并之Merge合并

    1.Merge语法 merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, rig ...

最新文章

  1. 【译】在ASP.NET中创建PDF-iTextSharp起步
  2. 腾讯发布人工智能辅助翻译,致敬人工翻译
  3. BZOJ1295 [SCOI2009]最长距离
  4. PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法
  5. ADO.NET五大对象详解
  6. 【PAT甲级 大整数BigInteger】1065 A+B and C (64bit) (20 分) Java 全部AC
  7. iOS中几种定时器 - 控制了时间,就控制了一切
  8. java web 程序---javabean实例--登陆界面并显示用户名和密码
  9. .net mvc 超过了最大请求长度 限制文件上传大小
  10. 腾讯招.NET5,居然要求精通MySQL,而不是SQLServer!
  11. gulp基础使用方法记录
  12. Docker完全自学手册
  13. 漫步最优化十——极值类型
  14. 大龄屌丝自学笔记--Java零基础到菜鸟--006
  15. 三角形的几何公式大全_解析几何(椭圆)常见二级结论92条附详细证明
  16. 积分商城消费系统定制
  17. Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用)
  18. 双显卡同时显示多个显示屏
  19. Jenkins端口号修改
  20. ccs C语言编译器,CCS C 编译器手册2010.pdf

热门文章

  1. DJI-F450无人机硬件部分装配
  2. el-table 动态多级表头以及数据
  3. 中文文本分类的java包_java实现中文文本分类
  4. 微信小程序中使用 SHA256加密
  5. matplotlib :lengend图例参数(bbox_to_anchor)的使用
  6. dubbo负载容错策略
  7. 关于CreateEvent的简单理解
  8. php 小程序即时聊天,小程序组件:聊天会话组件的介绍(附代码)
  9. 奥比中光深度相机使用笔记一
  10. 鸿蒙系统电视评测,荣耀智慧屏体验评测:电视只是小功能,鸿蒙系统才是真亮点...