【问题标题】:JDBC - Oracle - BatchUpdateException.getUpdateCounts() returns blank arrayJDBC - Oracle - BatchUpdateException.getUpdateCounts() 返回空白数组
【发布时间】:2016-01-06 04:31:16
【问题描述】:

我正在尝试使用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,

【问题讨论】:

  • 空数组是指长度为0的数组吗?如果是这样,那么很可能是因为您实际上并没有在批次中添加任何东西,例如count 为 0。
  • 打印异常可能会提供一些见解
  • @Andreas - 它有 11 条记录,即计数为 11

标签: java oracle jdbc prepared-statement


【解决方案1】:

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

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

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

至于 updateCounts:如果您的批次在 一个事务 中运行(这是有道理的),那么所有插入都将在错误时滚动 - 导致什么也没做。

【讨论】:

  • 根据 Javadoc...“BatchUpdateException 提供了在批量更新期间成功执行的所有命令的更新计数,即在错误发生之前执行的所有命令”,我没有连那个都不懂
  • 使用 bu.printStackTrace () 打印您的异常并将其发布到您的问题中
  • 更新答案以反映您的新信息。
  • 有没有办法进行批量插入/更新并知道单个查询成功或失败?
  • 您可以分享实际语句的代码(编辑问题)吗?值等如何填写?
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 2016-06-02
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多