我有一个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中遇到了一些错误,但无法证明这一点。 我的问题是否有办法可以避免这个问题?逐个插入不是一个选项,因为我们有大文件,而且需要花费太多时间。
答案 0 :(得分:0)
尝试
prpst.setInt(5,new Integer(1))
变量“numLine”的类型是什么? 您能否共享与您在PreparedStatement中设置的字段对应的列类型? 通过“onebyoneInsert”处理一次尝试。分享此案例的输出。它可能有助于确定根本原因。 同时将“numLine”的值打印到控制台。