点评 ibatis+oracle 批量插入的三种方法.

标签: ibatisoraclejava
10091人阅读 评论(10) 收藏 举报
分类:
第一种
< 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语句应该不会写这么长吧?



5
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:468143次
    • 积分:4852
    • 等级:
    • 排名:第6536名
    • 原创:97篇
    • 转载:31篇
    • 译文:0篇
    • 评论:314条
    个人简介
    我只是一个简单的Coder,为了兴趣和理想奋斗在生活的道路上
    希望大家多多交流,共同进步,有疑问或想法请留言或者私信,也可以加群:157797573

    博客专栏
    最新评论
    你还在一个人孤独的奋斗吗?
    其实,你并不寂寞,欢迎加入CSDN Java群,这里是你的另一个家!    点击加入:CSDN Java群