插入数据库

时间:2013-04-23 16:08:31

标签: java oracle mybatis

我正在使用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。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我问“你的目标表真的只有两列吗?”你说:

  

它有20列

我认为这是错误的根源。

INSERT ALL语句受Oracle限制的约束,即SQL语句只能有1000列。每条INTO线都有一个投影,所有这些列的总和不能超过1000.

现在,您的ibatis命令将为列表中的每个条目生成一个INTO行。 750个条目* 20列容易吹1000列限制。因此错误。

如何解决?

在Oracle中,我们可以使用TABLE()函数将嵌套表(列表)转换为如下数据源:

insert into table_name
select * from table (some_list) ;

通常我希望像这样的调用包装在存储过程中。但无论如何,列表必须符合先前在数据库中定义的SQL类型(对象)。

所以你可能不想沿着那条路走下去,因为我猜你;'特意使用Ibatis来避免与数据库对象争吵。但如果您决定采取这种方式,您可能会发现this tutorial有帮助。

否则,我担心您需要将列表中的条目数限制为50。您可能认为这有点痛苦,但实际上ibatis并不适合进行批量上传。