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。

4

2 回答 2

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 来避免与数据库对象争吵。但是,如果您决定采用这条路线,您可能会发现本教程很有帮助。

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

于 2013-04-24T12:20:16.050 回答
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>
于 2013-04-23T17:46:40.843 回答