0

我有一个 java 应用程序,它读取文件并逐行写入 oracle db。我们在批量插入期间遇到了一个奇怪的错误,而在顺序插入期间不会发生这种错误。这个错误很奇怪,因为它只发生在 AIX 平台上的 IBM JDK7 上,而且我每次都在不同的行上得到这个错误。我的代码如下所示:

prpst = conn.prepareStatement(query);
while ((line = bf.readLine()) != null) {
  numLine++;
  batchInsert(prpst, line);
  //onebyoneInsert(prpst, line);
}

private static void batchInsert(PreparedStatement prpst, String line) throws IOException, SQLException {
  prpst.setString(1, "1");
  prpst.setInt(2, numLine);
  prpst.setString(3, line);
  prpst.setString(4, "1");
  prpst.setInt(5, 1);
  prpst.addBatch();
  if (++batchedLines == 200) {
    prpst.executeBatch();
    batchedLines = 0;
    prpst.clearBatch();
  }
}

private static void onebyoneInsert(PreparedStatement prpst, String line) throws Exception{
  int batchedLines = 0;
  prpst.setString(1, "1");
  prpst.setInt(2, numLine);
  prpst.setString(3, line);
  prpst.setString(4, "1");
  prpst.setInt(5, 1);
  prpst.executeUpdate();
}

我在批量插入模式下收到此错误:

java.sql.BatchUpdateException: ORA-01461: can bind a LONG value only for insert into a LONG column

        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10345)

我已经知道为什么会发生这个 Ora 错误,但这不是我的情况。我几乎可以肯定我没有将一些大数据设置为较小的列。可能是我在 IBM jdk7 中遇到了一些错误,但无法证明这一点。我的问题是否有办法可以避免这个问题?一个一个插入不是一个选项,因为我们有大文件并且需要太多时间。

4

1 回答 1

0

尝试

prpst.setInt(5,新整数(1))

变量“numLine”的类型是什么?您可以共享与您在 PreparedStatement 中设置的字段相对应的列类型吗?通过使用“onebyoneInsert”处理一次尝试。分享这个案例的输出。它可能有助于确定根本原因。还将“numLine”的值打印到控制台。

于 2015-08-03T10:10:22.747 回答