ВСТАВИТЬ ВСЕ - Для более чем 1000 строк - PullRequest
0 голосов
/ 13 марта 2019

У меня в моей программе запрос 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, а также на других сайтах, чтобы убедиться, что выбор записей из более чем 1000 строк указан только для запроса SELECT , а не для запроса INSERT .

Может кто-нибудь помочь мне? Было бы очень полезно.

1 Ответ

0 голосов
/ 04 апреля 2019

Вам необходимо выполнить пакетную вставку.

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 id="insertRecord">
  INSERT INTO MYTABLE (COLUMN1, COLUMN2, COLUMN3)
  VALUES (#{addrElement.element1}, #{addrElement.element2}, #{addrElement.element3})
</insert>

У нас есть FAQ запись .

...