在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入。期间遇到了“SQL 命令未正确结束 ”的错误,最终解决,记录下来供以后查阅和学习。
之前写的:
insert into WC_PURCHASE_INVOICE_D (invoiceid,itemname,purchaseno,costid,typeid,typename,spec,weight,price,amountnotax,taxrate,taxvalue,amounttax,creator,updateby,updatetime,handcode)
values
( #{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}
)
把SQL复制出来在PL/SQL中运行也是报同样的错,如上也可以看出,使用批量插入执行的SQL语句等价于: INSERT INTO xxx(xx,xx) VALUES (?,?),(?,?),而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的 。查了资料之后发现这是适用于MySQL的,不适用于Oracle,因此把xml文件修改一下:
insert into WC_INVOICE_D (invoiceid,itemname,purchaseno,costid,typeid,typename,spec,weight,price,amountnotax,taxrate,taxvalue,amounttax,creator,updateby,updatetime,handcode)
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
运行通过。
在Oracle的版本中,有几点需要注意的:
1.SQL中没有VALUES;
2.
3.