您的位置:首页 > 数据库 > Oracle

mybatis批量插入数据到oracle出错

2017-05-03 15:06 309 查看
在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入。期间遇到了“SQL 命令未正确结束 ”的错误,最终解决,记录下来供以后查阅和学习。

之前写的:

<insert id="addInvoiceDetailList" parameterType="java.util.List">
insert into WC_PURCHASE_INVOICE_D (invoiceid,itemname,purchaseno,costid,typeid,typename,spec,weight,price,amountnotax,taxrate,taxvalue,amounttax,creator,updateby,updatetime,handcode)
values
<foreach collection="list" item="item" index="index" separator="," >
(	#{item.invoiceid,jdbcType=VARCHAR},
#{item.itemname,jdbcType=VARCHAR},
#{item.purchaseno,jdbcType=VARCHAR},
#{item.costid,jdbcType=VARCHAR},
#{item.typeid,jdbcType=VARCHAR},
#{item.typename,jdbcType=VARCHAR},
#{item.spec,jdbcType=VARCHAR},
#{item.weight,jdbcType=DOUBLE},
#{item.price,jdbcType=DOUBLE},
#{item.amountnotax,jdbcType=DOUBLE},
#{item.taxrate,jdbcType=DOUBLE},
#{item.taxvalue,jdbcType=DOUBLE},
#{item.amounttax,jdbcType=DOUBLE},
#{item.creator,jdbcType=VARCHAR},
#{item.updateby,jdbcType=VARCHAR},
sysdate,
#{item.handcode,jdbcType=VARCHAR}

)
</foreach>
</insert>



这条sql插入一条时没报错,但是插入多条的时候就会报错(ORA-00933: SQL 命令未正确结束),

把SQL复制出来在PL/SQL中运行也是报同样的错,如上也可以看出,使用批量插入执行的SQL语句等价于: INSERT INTO xxx(xx,xx) VALUES (?,?),(?,?),而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的 。查了资料之后发现这是适用于MySQL的,不适用于Oracle,因此把xml文件修改一下:

<insert id="addInvoiceDetailList" parameterType="java.util.List">
insert into WC_INVOICE_D (invoiceid,itemname,purchaseno,costid,typeid,typename,spec,weight,price,amountnotax,taxrate,taxvalue,amounttax,creator,updateby,updatetime,handcode)
<foreach collection="list" item="item" index="index" separator="UNION ALL">
select
#{item.invoiceid,jdbcType=VARCHAR},
#{item.itemname,jdbcType=VARCHAR},
#{item.purchaseno,jdbcType=VARCHAR},
#{item.costid,jdbcType=VARCHAR},
#{item.typeid,jdbcType=VARCHAR},
#{item.typename,jdbcType=VARCHAR},
#{item.spec,jdbcType=VARCHAR},
#{item.weight,jdbcType=DOUBLE},
#{item.price,jdbcType=DOUBLE},
#{item.amountnotax,jdbcType=DOUBLE},
#{item.taxrate,jdbcType=DOUBLE},
#{item.taxvalue,jdbcType=DOUBLE},
#{item.amounttax,jdbcType=DOUBLE},
#{item.creator,jdbcType=VARCHAR},
#{item.updateby,jdbcType=VARCHAR},
sysdate,
#{item.handcode,jdbcType=VARCHAR}
from dual
</foreach>
</insert>


运行通过。

在Oracle的版本中,有几点需要注意的:

1.SQL中没有VALUES;

2.<foreach>标签中的(selece ..... from dual);

3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: