2

我正在从 excel 表中提取数据并将它们插入到我的 oracle 表中。数据库的设置方式是,在执行批处理语句时,如果批处理中的任何插入语句失败,则批处理中的所有其他语句都不会执行。所以我的问题是如何找出是哪一行数据实际导致了它,所以我可以向用户发送一条消息,其中包含导致问题的数据的行号?

Connection con = null;
    PreparedStatement pstmt = null;
    Iterator iterator = list.iterator();
    int rowCount = list.size();
    int currentRow = 0;
    String sqlStatement = "INSERT INTO DMD_VOL_UPLOAD (ORIGIN, DESTINATION, DAY_OF_WEEK, VOLUME)";
    sqlStatement += " VALUES(?, ?, ?, ?)";
int batchSize==1000;
for(currentRow=1; currentRow<=rowCount; currentRow++){
            ForecastBatch forecastBatch = (ForecastBatch)      iterator.next();                                 
            pstmt.setString(1, forecastBatch.getOrigin());
            pstmt.setString(2, forecastBatch.getDestination());
            pstmt.setInt(3, forecastBatch.getDayOfWeek());                                          
            pstmt.setInt(4, forecastBatch.getVolumeSum());

            pstmt.addBatch();
        if(i % batchSize == 0){
                updateCounts = pstmt.executeBatch();
                con.commit();
                pstmt.clearBatch();
                session.flush();
                session.clear();
            }
        }
4

2 回答 2

1

executeBatch返回一个整数数组,其中包含批处理中每个语句修改的所有行的计数。我认为负数用于表示错误。您应该能够使用此返回值找出哪些失败。

http://docs.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html

于 2012-04-20T21:22:27.283 回答
1

java.sql.Statement 的 javadoc 说如果发送到数据库的命令之一未能正确执行或尝试返回结果集,则会 executeBatch()抛出(SQLException 的子类)。BatchUpdateException

“..检索在此异常发生之前成功执行的批量更新中每个更新语句的更新计数...” getUpdateCount()的 方法java.sql.BatchUpdateException

如果这些都不起作用,您可能不得不退回到单独执行和提交每个语句(在此特定批次中),直到遇到错误。

于 2012-04-20T22:16:42.950 回答