全部插入-超过1000行

时间:2019-03-13 12:51:44

标签: java oracle12c mybatis

我的程序中有一个 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 指定了记录查询。

有人可以帮我吗?会很有帮助的。

1 个答案:

答案 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