2013-04-23 148 views
1
我使用的MyBatis插入值

使用:插入數據庫

Dao.xml

<insert id="someId" parameterType="someBean" > 
    INSERT ALL 
    <foreach collection="list" item="item" index="index" > 
    INTO table_name 
       (ID,NAME)   
    VALUES 
    (#{item.id},#{item.name}) 
    </foreach> 
    SELECT * FROM DUAL 
</insert> 

Dao.java

void someId(List<SomeBean> list); 

列表大小通過爲:350

不過,雖然執行了引發錯誤:

org.springframework.jdbc.UncategorizedSQLException: 
Error updating database. Cause: java.sql.SQLException: ORA-24335: cannot support more than 1000 columns 

這裏使用的數據庫是oracle。

+0

你的目標表*真的*只有兩列嗎? – APC 2013-04-23 16:33:27

+0

@APC它有20列。 – abc 2013-04-24 10:56:57

回答

1

我問:「你的目標表真的只有兩列嗎?」你說:

It has 20 columns

我認爲這是錯誤的根源。

INSERT ALL語句受限於SQL語句只能有1000列的Oracle限制。每個INTO行都有一個投影,所有列的總和不能超過1000.

現在,您的ibatis命令將爲列表中的每個條目生成一條INTO行。 750個條目* 20個列可輕鬆滿足1000個列的限制。因此錯誤。

如何解決?

那麼在Oracle中,我們可以使用TABLE()函數把嵌套表(表)到這樣一個數據源:

insert into table_name 
select * from table (some_list) ; 

通常我會期待這樣的通話將被包裹在一個存儲過程。但無論哪種方式,列表都必須符合之前在數據庫中定義的SQL Type(對象)。

所以你可能不想沿着那條路走下去,因爲我猜你;專門用Ibatis來避免與數據庫對象發生爭執。但是如果你決定採取這條路線,你可能會發現this tutorial有幫助。

否則,我擔心您需要將列表中的條目數限制爲五十。您可能認爲這有點痛苦,但真正的ibatis並不是做批量上傳的正確工具。

+0

非常感謝你!我真的很感激你能否給我提供一些鏈接,從那裏我可以獲得更多有關'真正的ibatis不是做批量上傳的正確工具'以及可以用來替代的東西的知識。 – abc 2013-04-24 12:48:13

1

您正在使用多表插入,它不是用於將記錄插入到一​​個表中。改爲使用以下內容。

<insert id="someId" parameterType="someBean" > 
    INSERT INTO table_name (ID,NAME) VALUES 
    <foreach collection="list" item="item" index="index" o >    
     (#{item.id},#{item.name}) 
    </foreach> 
</insert> 
+0

thx 4 ur reply..but當我嘗試你的查詢,當在oracle中使用結果到錯誤:'SQL錯誤:ORA-00933:SQL命令未正確結束' – abc 2013-04-24 10:49:31

+0

@Pradeep感謝您的幫助.. – abc 2013-04-24 14:35:08

+0

@abc做了改變工作? – 2013-04-24 14:42:08