我正在使用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 :(得分: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并不适合进行批量上传。