经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
ibatis结合oracle批量插入三种方法的测评
来源:jb51  时间:2018/12/12 9:29:20  对本文有异议

第一种

  1. < insert id =" insert_table " parameterClass ="java.util.List" >
  2. <![CDATA[
  3. insert into sj_test( col1 , col2 , col3 ) values
  4. ]]>
  5. < iterate conjunction ="," >
  6. <![CDATA[
  7. (#test[]. col1 #, # test []. col2 #, # test []. col3 #)
  8. ]]>
  9. </ iterate >
  10. </ insert >

这种方式是网上最常见的,但是也是问题最大的,今天把我彻底纠结了,弄了几个小时,最后发现,Oracle不支持 一个insert多个values的方式,不知道网友们被坑到了没,好像MySQL支持这种方式,所报的错误:ORA-00933:SQL命令未正确结束

第二种

  1. <insert id="insert_table " parameterClass="java.util.List">
  2. insert all
  3. <iterate conjunction="">
  4. into sj_test( col1 , col2 , col3 ) values
  5. (#test[]. col1 #, # test []. col2 #, # test []. col3 #)
  6. </iterate>
  7. <!--必须要加上 -->
  8. select * from dual
  9. </insert>

这种方式,Oracle支持,其他的数据库就不知道支不支持,但是这种方式有个局限性,就是你插入的表的列数* 你插入的行数 <1000 才有效

如:

我今天需要插入的表有13列字段,总共需要插入246行,在执行的时候

他就报:ORA-24335 cannot support more than 1000 columns

第三种方式

  1. <insert id="insert_table" parameterClass="java.util.List">
  2. insert into sj_test( col1 , col2 , col3 ) values select
  3. col1 , col2 , col3
  4. from (
  5. <iterate conjunction=" union all ">
  6. select
  7. #test[].col1# as col1 , #test []. col2# as col2, # test[].col3# as col3 from dual
  8. </iterate>
  9. )
  10. </insert>

这种方式 是先将List里面的值,循环拼接成一个查询虚拟表,然后再通过查询虚拟表,获取每一行的数据 插入到你需要插入的表里面去.    这样的话有个需要注意的地方,就是你拼接的SQL语句的长度有没有超过Oracle的最大长度,不过Oracle的最大长度是64KB,你的SQL语句应该不会写这么长吧?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。如果你想了解更多相关内容请查看下面相关链接

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号