当前位置:   article > 正文

mybatis插入List集合到Oracle报ORA-00933_oracle mybatis不能有;ora-00933

oracle mybatis不能有;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数据库实现批量添加数据(如果数据存在就更新,不存在就插入) - 码农教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/158300
推荐阅读
相关标签
  

闽ICP备14008679号