spring+mybatis批量插入和单个插入报ORA-00933: SQL 命令未正确结束(Oracle)

Mybatis批量插入需要foreach元素。foreach元素有以下主要属性:
 (1)item:集合中每一个元素进行迭代时的别名。
(2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置。
(3)collection:根据传入的参数值确定。
(4)open:表示该语句以什么开始。
(5)separator:表示在每次进行迭代之间以什么符号作为分隔 符。
(6)close:表示以什么结束。
首先,错误的xml配置文件如下:
<insert id="save" databaseId="oracle">
insert into "sys_user_role"
(
"user_id",
"role_id"
)values
<foreach collection="roleIdList" item="item" index="index" separator="," >
(
#{userId},
#{item}
)
</foreach>
</insert>
如果如上这样写就会报错:SQL 命令未正确结束。
经过修改后正确的xml配置文件如下:
<insert id="save" databaseId="oracle">
insert into "sys_user_role"
(
"user_id",
"role_id"
)
<foreach collection="roleIdList" item="item" index="index" separator="UNION ALL" >
SELECT
#{userId},
#{item}
FROM dual
</foreach>
</insert>
根据上下配置文件,需要注意三个地方:
(1)需要取掉values
(2)separator属性值改为UNION ALL。因为在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的
(3)foreach标签中需要取掉括号,加入select ..from dual.

还有一点需要注意,如果还是报SQL命令未正确结束的话
<insert id="insert_" useGeneratedKeys="false">
</insert>
批量插入时,如果没有主键,一定要显式指定useGeneratedKeys为false,否则会报: SQL 命令未正确结束
以上为转载信息.
下面是我项目中的实战例子,我这里没用到 databaseId="oracle"也可以成功 :


<insert id="insertTree" useGeneratedKeys="false" parameterType="java.util.List">
insert into TEST_USER_CODE_VALUE2 (UCV_ID,USER_ID,CODING_ID,STATUSS )
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT
#{item.ucvId,jdbcType=VARCHAR},
#{item.userId,jdbcType=VARCHAR},
#{item.codingId,jdbcType=VARCHAR},
#{item.statuss,jdbcType=VARCHAR}
FROM dual
</foreach>
</insert>

欢迎大家评论交流

原文章转自:           https://blog.csdn.net/dou612/article/details/51427566

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值