#java #oracle12c #mybatis
#java #oracle12c #mybatis
Вопрос:
У меня есть запрос ВСТАВИТЬ ВСЕ в моей программе, например:
<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 записей.
Очевидно, что это вызывает исключение, поскольку ВСТАВИТЬ ВСЕ не может обработать более 1000 записей.
; неправильная грамматика SQL []; вложенным исключением является java.sql.SQLSyntaxErrorException: ORA-00913: слишком много значений
Я проверил множество ответов в SO, а также на других сайтах, чтобы убедиться, что выбор записей, превышающих 1000 строк, указан только для запроса SELECT, а не для запроса INSERT.
Может ли кто-нибудь помочь мне в этом? Было бы очень полезно.
Комментарии:
1. Как насчет пакетов?
Ответ №1:
Вам необходимо выполнить пакетную вставку.
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>
У нас есть запись часто задаваемых вопросов.