Oracle  merge into插入和修改数据

Oracle  merge into插入和修改数据

目录

语法:

Mybatis:

单个插入:

多个插入:

总结:


 

在使用oracle数据库,需要操作数据,增加和删除。使用merge into 的语法可以一个语句搞定。

 

语法:

 

 MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)

WHEN MATCHED THEN

  [UPDATE sql]

WHEN NOT MATCHED THEN

  [INSERT sql]

 

虚拟例子

MERGE INTO tableX x

             USING (SELECT 1222 AS id, 'yan' AS name FROM dual) y

             ON ( x.id=y.id)

             WHEN MATCHED THEN

                    UPDATE SET x.name = y.name

             WHEN NOT MATCHED THEN

                    INSERT (id,name) VALUES(y.id,y.id);

 

实际例子

merge INTO report_show_cfg a

using (select 5 as cfgId,

              1 as classId,

              '0BF' as isPage,

              10 as pageSize

         from dual) b

on (a.CFG_ID = b.cfgId and a.CLASS_ID = b.classId)

when matched then

  update

     set a.IS_PAGE         = b.isPage,

         a.PAGE_SIZE       = b.pageSize

 -- 这边就不用写判断条件了,上面on 里面有

 --  where a.CFG_ID = b.cfgId and a.CLASS_ID = b.classId

when not matched then

  insert

    (a.CFG_ID,

     a.CLASS_ID,

     a.IS_PAGE,

     a.PAGE_SIZET)

  values

    (REPORT_SHOW_CFG_SEQ.nextval,

     b.classId,

     b.isPage,

     b.pageSize)

了解了语法,操作起来比较简单,那对应mybatis里面的xml怎么写呢?

 

Mybatis:

单个插入:

Mapper:

void mergeReportShowCfg(@Param("param") ReportShowCfg reportShowCfg);

显象声明参数,养成好习惯

 

Xml:

<update id="mergeReportShowCfg" parameterType=" report.entity.ReportShowCfg" databaseId="oracle">

  merge into sys_report_show_cfg a using   (
      SELECT #{param.cfgId,jdbcType=BIGINT} as cfgId,  #{param.classId,jdbcType=BIGINT} as classId,
      #{param.isPage,jdbcType=VARCHAR} as isPage, #{param.pageSize,jdbcType=INTEGER} as pageSize FROM dual
    ) b  on (
      a.CFG_ID= b.cfgId
          AND a.CLASS_ID= b.classId
    )
    when matched then
    UPDATE SET
    a.IS_PAGE = b.isPage,
    a.PAGE_SIZE = b.pageSize
  # 这边就不用写判断条件了,上面on 里面有 
#  where a.CFG_ID= b.cfgId AND a.CLASS_ID= b.classId
    when not matched then
    INSERT (a.CFG_ID, a.CLASS_ID, a.IS_PAGE, a.PAGE_SIZE)
    values (
SYS_REPORT_SHOW_CFG_SEQ.nextval,b.classId,b.isPage,b.pageSize )
</update>

#{param.cfgId,jdbcType=BIGINT} 声明参数的数据类型

 

databaseId="oracle" 指定使用什么数据库。 在多数据库中会用到,比如可能用mysql数据,pg数据库等

 

 

多个插入:

Mapper:

void mergeReportParamBach(@Param("reportParamList") List<ReportParam> reportParamList);
 

Xml:

<update id="mergeSysReportParamBach"  databaseId="oracle">

 merge into report_param a using   (
  <foreach collection="reportParamList" index="index" item="item" open=""
           close="" separator="union all">
    SELECT #{item.paramId,jdbcType=BIGINT} as paramId,  #{item.paramName,jdbcType=VARCHAR} as paramName,
    #{item.sortId,jdbcType=INTEGER} as sortId, #{item.classId,jdbcType=BIGINT} as classId FROM dual
  </foreach>
  ) b  on (
  a.PARAM_ID= b.paramId
  AND a.CLASS_ID= b.classId
  )
  when matched then
  UPDATE SET
    a.PARAM_NAME = b.paramName,
a.SORT_ID = b.sortId
# 这边就不用写判断条件了,上面on 里面有 
# where a.PARAM_ID= b.paramId   AND .CLASS_ID= b.classId
  when not matched then
  INSERT (a.PARAM_ID, a.PARAM_NAME,a.SORT_ID, a.CLASS_ID)
  values (
  SYS_REPORT_PARAM_SEQ.nextval,b.paramName,b.sortId,b.classId
  )

</update>

 

总结:

     使用oracle数据库,merge into 可以一起处理增加修改的操作。

     在mybatis注意参数的显象声明和声明数据类型。

      Xml里面中指定databaseId 可以根据实际情况,动态读取数据库。 具体情况参考 数据操作,使用不同数据库处理方式

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值