mybatis批量插入数据到oracle出错

在程序中封装一个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插入一条时没报错,但是插入多条的时候就会报错(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 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.标签中的(selece ..... from dual);

3.标签中的separator的属性为"UNION ALL",将查询合并结果集。



你可能感兴趣的:(java,Mybatis)