mybatis插入List集合到Oracle报ORA-00933

一、环境说明

mybatis版本:mybatis-3.4.5.jar

Oracle版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

二、报ORA-00933

java实体类

public class Eenty implements Serializable{
    private String sdate;
    private String rs;
    private String groupId;
   
    public String getSdate() {
        return sdate;
    }

    public void setSdate(String sdate) {
        this.sdate = sdate;
    }

    public String getRs() {
        return rs;
    }

    public void setRs(String rs) {
        this.rs = rs;
    }

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

}

Dao层

public interface EentyDao{

    int refreshDataList(@Param("list")List<Eenty> list);

}

xxMapper.xml

<insert id="refreshDataList"  parameterType="java.util.List">
               <!--这里column_1,column_2,column_3  为 表的字段名-->
            insert into table_name(column_1,column_2,column_3)
        values
            <foreach collection="list" separator="," item="item" index="index">
            ( #{item.sdate},
            #{item.rs},
            #{item.groupId}
            )
        </foreach>
</insert>

启动项目后插入数据报ORA-00933

原因分析:oracle19c不支持insert批量插入, 即INSERT INTO table_name(column_1,column_2,column_3 ) VALUES (?,?,?),(?,?,?)这种语法oracle19c不支持,但是mysql支持。

三、错误处理方法

错误处理方式一:

<insert id="refreshDataList" parameterType="java.util.List">

            insert into table_name(column_1,column_2,column_3)

SELECT  t.*

FROM(

<foreach collection="list" item="item" index="index" separator="UNION ALL">

 SELECT

            ( #{item.sdate},
            #{item.rs},
            #{item.groupId}

     FROM dual

   </foreach>

   )t

  </insert>

会导致的结果:会插入重复的数据(注意不是list有重复数据),而是此种写法会导致数据重复。

错误处理方式二(distinct):

<insert id="refreshDataList" parameterType="java.util.List">

            insert into table_name(column_1,column_2,column_3)

SELECT distinct  t.*

FROM(

<foreach collection="list" item="item" index="index" separator="UNION ALL">

 SELECT

            ( #{item.sdate},
            #{item.rs},
            #{item.groupId}

     FROM dual

   </foreach>

   )t

  </insert>

会导致的结果:会插入重复的数据(注意不是list有重复数据),而是此种写法不能去重。

错误处理方式三(NOT EXISTS):

<insert id="refreshDataList" parameterType="java.util.List">

INSERT INTO table_name
            (column_1,column_2,column_3)
SELECT t.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
 SELECT

#{item.sdate},
#{item.rs},
#{item.groupId}

     FROM dual
</foreach>

)t
 WHERE
NOT EXISTS
    (
        SELECT 1 FROM table_name WHERE
        column_1 =#{item.sdate}
        AND column_2 =#{item.rs}
                AND column_3 =#{item.groupId}
    )

  </insert>

会导致的结果:会插入重复的数据(注意不是list有重复数据),而是此种写法不能去重。

四、正确处理方法

 <insert id="refreshDataList" parameterType="java.util.List">
      merge into table_name t1
      USING (
      <foreach collection="list" item="item" index="index" separator="union all">
         select
         #{item.sdate} sdate,
         #{item.rs} rs,
         #{item.groupId} groupId,
         #{item.groupName} groupName
         from dual
      </foreach>) t2
      ON (
      t1.column_1 = t2.sdate
      and t1.column_2 = t2.rs
      and t1.column_3 = t2.groupId
      )
      WHEN MATCHED THEN
      UPDATE
      SET
      t1.column_4 = t2.groupName
      WHEN NOT MATCHED THEN
      INSERT
     (column_1,column_2,column_3,column_4)
      values
      (t2.sdate,
      t2.rs,
      t2.groupId,
      t2.groupName)
   </insert>

可参考:mybatis 处理Oracle数据库实现批量添加数据(如果数据存在就更新,不存在就插入) - 码农教程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值