第一种
- < insert id =" insert_table " parameterClass ="java.util.List" >
- <![CDATA[
- insert into sj_test( col1 , col2 , col3 ) values
- ]]>
- < iterate conjunction ="," >
- <![CDATA[
- (#test[]. col1 #, # test []. col2 #, # test []. col3 #)
- ]]>
- </ iterate >
- </ insert >
这种方式是网上最常见的,但是也是问题最大的,今天把我彻底纠结了,弄了几个小时,最后发现,Oracle
不支持 一个insert
多个values
的方式,不知道网友们被坑到了没,好像MySQL
支持这种方式,所报的错误:ORA-00933:SQL命令未正确结束
第二种
- <insert id="insert_table " parameterClass="java.util.List">
- insert all
- <iterate conjunction="">
- into sj_test( col1 , col2 , col3 ) values
- (#test[]. col1 #, # test []. col2 #, # test []. col3 #)
- </iterate>
- <!--必须要加上 -->
- select * from dual
- </insert>
这种方式,Oracle
支持,其他的数据库就不知道支不支持,但是这种方式有个局限性,就是你插入的表的列数* 你插入的行数 <1000 才有效
如:
我今天需要插入的表有13列字段,总共需要插入246行,在执行的时候
他就报:ORA-24335 cannot support more than 1000 columns
第三种方式
- <insert id="insert_table" parameterClass="java.util.List">
- insert into sj_test( col1 , col2 , col3 ) values select
- col1 , col2 , col3
- from (
- <iterate conjunction=" union all ">
- select
- #test[].col1# as col1 , #test []. col2# as col2, # test[].col3# as col3 from dual
- </iterate>
- )
- </insert>
这种方式 是先将List
里面的值,循环拼接成一个查询虚拟表,然后再通过查询虚拟表,获取每一行的数据 插入到你需要插入的表里面去. 这样的话有个需要注意的地方,就是你拼接的SQL
语句的长度有没有超过Oracle
的最大长度,不过Oracle
的最大长度是64KB,你的SQL
语句应该不会写这么长吧?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。如果你想了解更多相关内容请查看下面相关链接