gpt4 book ai didi

java - 插入数据库

转载 作者:行者123 更新时间:2023-11-30 04:24:57 25 4
gpt4 key购买 nike

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

最佳答案

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

It has 20 columns

我认为这是错误的根源。

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 并不是进行批量上传的正确工具。

关于java - 插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16174195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com