Java 批处理在Oracle中失败。找出批处理中的哪个语句导致了它

Java 批处理在Oracle中失败。找出批处理中的哪个语句导致了它,java,database,oracle11g,relational-database,struts-1,Java,Database,Oracle11g,Relational Database,Struts 1,我正在从excel工作表中提取数据,并将它们插入到我的oracle表中。数据库的设置方式是,在执行批处理语句时,如果批处理中的任何insert语句失败,则不会执行批处理中的所有其他语句。所以我的问题是,我如何才能找出哪一行数据实际上是导致问题的原因,这样我就可以向用户发送一条消息,其中包含导致问题的数据的行号 Connection con = null; PreparedStatement pstmt = null; Iterator iterator = list.iterat

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

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();
            }
        }
连接con=null;
PreparedStatement pstmt=null;
迭代器迭代器=list.Iterator();
int rowCount=list.size();
int currentRow=0;
String sqlStatement=“插入DMD卷上传(起点、目的地、一周中的第几天、卷)”;
sqlStatement+=“值(?,?,?)”;
int batchSize==1000;

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


java.sql.Statement的javadoc说,如果发送到数据库的命令之一未能正确执行或试图返回结果集,则
executeBatch()
将抛出
BatchUpdateException
(SQLException的子类)。
java.sql.BatchUpdateException
”的方法
getUpdateCount()
。检索在此异常发生之前成功执行的批处理更新中每个更新语句的更新计数
如果这些都不起作用,那么您可能不得不退回到执行和提交每个语句(在这个特定的批处理中)直到您遇到错误为止。

谢谢您的回复。我查看了该api。如果我的批处理有10条insert语句,第5条语句失败,那么其他9条语句也会失败。因此,批处理语句返回一个包含10个负数的数组,因为所有这些语句都失败了。如果我的系统或数据库设置为继续执行对批处理中的其余语句进行排序,即使其中一条语句失败,那么返回的数组中失败的语句将有一个负数,其余的语句将有+ve。我将能够知道哪个语句失败。但事实并非如此,如果一条语句失败,所有语句都会失败。可能有某种方法可以告诉批处理尽可能多地执行操作在执行之前,请先将其设置为ble。否则,您必须对更新集进行二进制搜索,以找到破坏它的更新集…谢谢Keith。虽然我已尝试将batchSize设置为0,但您的回答为我指明了一个方向,我可能会在将来有更多时间时探索该方向。似乎我必须将批次大小更改为1并执行每次插入一条语句并提交它。但这会导致巨大的性能损失。我花了大约5分钟完成执行。根据你的解决方案,这听起来是一个更好的选择,我的问题是,我怎么知道这个特定的批会给我一个异常?你是对的,你不会事先知道。我在想您将在pstmt.executeBatch()周围放置一个try/catch,它将捕获BatchUpdateException。在其catch块中,回溯“i”计数器(顺便说一句,我不知道如何在代码中维护它),并开始执行从i*到batchSize的语句,每次执行一个。