阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

173次阅读
没有评论

共计 2460 个字符,预计需要花费 7 分钟才能阅读完成。

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

更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2460字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中