點評 ibatis+oracle 批量插入的三種方法.

執筆記憶的空白發表於2014-04-02
第一種
< 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語句應該不會寫這麼長吧?



相關文章