2013-04-23 151 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