mybatis批量插入数据到oracle出错
2017-05-03 15:06
309 查看
在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入。期间遇到了“SQL 命令未正确结束 ”的错误,最终解决,记录下来供以后查阅和学习。
之前写的:
这条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文件修改一下:
运行通过。
在Oracle的版本中,有几点需要注意的:
1.SQL中没有VALUES;
2.<foreach>标签中的(selece ..... from dual);
3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。
之前写的:
<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",将查询合并结果集。
相关文章推荐
- Java实现mybatis批量插入数据到Oracle
- Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
- mybatis批量插入数据到oracle
- Oracle服务器插入中文数据出错的解决方法
- mybatis批量插入数据到oracle
- mybatis批量插入数据到Oracle中的两种方式
- oracle 使用游标批量分段插入数据
- oracle分页查询及表的数据插入
- 在Oracle中向视图中插入数据的方法
- oracle存储过程中select into 在表中无数据时会出错
- ORACLE 中 FOR 语句循环插入数据
- 向oracle数据表中连续插入数据
- 使用EnterpriseLibrary插入Oracle CLOB数据
- Oracle Sql插入数据中特殊字符的处理
- 传参数无返回值的 java 调oracle的存储过程.(向数据库表中插入数据)
- 【oracle资料整理】--【3】如何插入修改删除数据
- 在jsp中插入、查询oracle日期数据
- Oracle循环插入测试数据
- ASP向ORACLE插入LOB型大对象数据方法
- oracle数据表插入时间