mybatis批量插入数据到oracle出错

本文介绍使用MyBatis在Oracle数据库中实现批量插入的方法,针对原有SQL语法问题进行了修正,采用UNION ALL方式成功实现了多条记录的同时插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在程序中封装一个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",将查询合并结果集。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值