赞
踩
一、环境说明
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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。