ВСТАВИТЬ ВСЕ — для более чем 1000 строк

#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>
  

У нас есть запись часто задаваемых вопросов.