首页数据库Oracle merge合并更新函数实例详解

Oracle merge合并更新函数实例详解

时间2024-02-28 14:15:03发布访客分类数据库浏览563
导读:收集整理的这篇文章主要介绍了Oracle merge合并更新函数实例详解,觉得挺不错的,现在分享给大家,也给大家做个参考。 前言MERGE语句是oracle9i新增的语法,用来合并UPD...
收集整理的这篇文章主要介绍了Oracle merge合并更新函数实例详解,觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

MERGE语句是oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作.

本博客介绍一下Oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用Oracle数据库的话,其实直接用Merge函数效率更快,而且merge函数性能也相对比较好

merge函数的语法:

MERGE INTO table_name alias1 USING (table|view|sub_query) alias2ON (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) A2ON(A1.seq = A2.seq)WHEN MATCHED THENUPDATE SET  A1.tips_seq = A2.tipsSeq,     A1.app_level = A2.appLevel,  A1.rela_seq = A2.relaSeqWHEN NOT MATCHED THENINSERT(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) {
       ListApprTipsRelatedModel>
     areaTipsList = new ArrayListApprTipsRelatedModel>
    ();
       //封装批量更新的地区列表   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 ? ? ?) ? 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

@H_126_61@您可能感兴趣的文章:
  • 为Plesk PHP7启用Oracle OCI8扩展方法总结
  • Mapper批量插入Oracle数据@InsertProvider注解
  • MySQL实现类似Oracle序列的方案
  • 如何利用Oracle命令解决函数运行错误
  • SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)
  • Oracle Index索引无效的原因与解决方法
  • Oracle中sql语句(+)符号代表连接的使用讲解
  • 抽取oracle数据到mysql数据库的实现过程
  • Oracle导入导出数据的几种方式
  • oracle如何解锁封锁的账号

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Oracle merge合并更新函数实例详解
本文地址: https://pptw.com/jishu/631532.html
Oracle导入导出数据的几种方式 Oracle中sql语句(+)符号代表连接的使用讲解

游客 回复需填写必要信息