我的程序中有一个 INSERT ALL 查询,
<insert id="insertRecord" parameterType="java.util.List">
INSERT ALL
<foreach collection="myList" item="addrElement" index="index">
INTO MYTABLE (COLUMN1,COLUMN2,COLUMN3) values (#{addrElement.element1},#{addrElement.element2},#{addrElement.element3})
</foreach>
SELECT * FROM dual
</insert>
该列表将至少保存10000条记录。
很显然,这会引发异常,因为 INSERT ALL 不能处理1000条以上的记录。
;错误的SQL语法[];嵌套的异常是java.sql.SQLSyntaxErrorException:ORA-00913:值太多
我已经在SO和其他站点中检查了很多答案,以检查是否仅为 SELECT 查询指定了超过1000行的记录,而不为 INSERT 指定了记录查询。
有人可以帮我吗?会很有帮助的。
答案 0 :(得分:0)
您需要执行批量插入。
int batchSize = 100;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
int size = list.size();
for (int i = 0; i < size;) {
mapper.insertRecord(list.get(i));
i++;
if (i % batchSize == 0 || i == size) {
sqlSession.flushStatements();
sqlSession.clearCache();
}
}
sqlSession.commit();
}
您应该为batchSize
找到一个适当的值(取决于各种因素)。
insert语句很简单。
<insert id="insertRecord">
INSERT INTO MYTABLE (COLUMN1, COLUMN2, COLUMN3)
VALUES (#{addrElement.element1}, #{addrElement.element2}, #{addrElement.element3})
</insert>
我们有一个FAQ entry。