我正在尝试使用PreparedStatement.executeBatch()执行批处理查询,并试图捕获BatchUpdateException中发生的任何异常。但是我在调​​用BatchUpdateException.getUpdateCounts()时得到了一个空白数组。

下面是我的代码:

int[] updateCounts = null;
PreparedStatement stmt = null;
// some logic to set the stmt and create the SQL query
try {
if (count % 100 == 0)
    {
        updateCounts = stmt.executeBatch();
     }
} catch (BatchUpdateException bu)
{
        updateCounts = bu.getUpdateCounts();
}


在这里,当发生异常时,我会得到一个空的updateCounts数组...为什么?

注意:

BatchUpdateException-


  SystemErr R java.sql.BatchUpdateException:ORA-01400:无法
  将NULL插入(“ TABLE_ABC”。“ AMOUNT”)


代码从中读取数据的CSV文件...预期在第三条记录中出现错误

Asof_Date,Price_Date,Amount
12/15/2015,11/26/2014,-2646.937686
12/15/2015,11/28/2014,5053.611471
12/15/2015,1/22/2015,
12/15/2015,1/23/2015,

最佳答案

好吧,根据javadoc,对于每个成功执行的语句的更新计数,您都会得到一个整数,因此,空数组表示批处理中的第一个语句失败。


  检索在此异常发生之前成功执行的批更新中每个更新语句的更新计数。


从异常可以看出,CSV中的空值会导致失败。因此,您要么对该列允许使用NULL,要么检查是否为null并插入0。

至于updateCounts:如果您的批处理在一个事务中运行(这很有意义),那么所有插入操作都会在出错时滚滚nack-结果什么也没做。

09-25 20:14