忽略 jdbc 批处理中的错误语句

Posted

技术标签:

【中文标题】忽略 jdbc 批处理中的错误语句【英文标题】:Ignore bad statements in jdbc batch 【发布时间】:2017-05-03 21:28:00 【问题描述】:

我有代码可以批量插入到 SqlServer 或 Oracle 表中。我如何告诉 JDBC A) 如果其中一个插入语句失败,请继续执行 B) 告诉我哪一个有问题

sql.withBatch("""Insert Into $job.table($columnNames)Values($values)""")  stmt ->
    data.each Map<String, String> row ->
        stmt.addBatch(newMap)
    

目前,如果其中一行有问题,它会成功插入之前的所有内容,然后停止插入行。它会告诉我错误消息,但不会告诉我是什么数据导致错误。 java 或 groovy 中的解决方案都可以。

我的问题和其他的不一样。他的问题特别是避免插入重复项。我需要防止批处理失败,因为插入因任何原因而失败。如果解决方案与 sql 相关,我需要 Tsql 和 PL/SQL 解决方案(另一篇文章特定于 postgresql)

【问题讨论】:

【参考方案1】:

使用 Oracle 时,无法告诉驱动程序在出现错误时继续执行批处理(您的 A 是不可能的)。但是您可以捕获 BatchUpdateException 并调用 getUpdateCounts() 以了解哪些行已成功执行。异常也会从数据库服务器返回错误信息。

【讨论】:

这是我的解决方案。我正在捕捉异常,记录它,跳过坏行,并根据 UpdateCount 使用子列表递归。谢谢!【参考方案2】:

以下可以在Oracle中实现

1) 创建错误记录表。

BEGIN
  DBMS_ERRLOG.create_error_log (dml_table_name => 'dest');
END;
/

2) 将以下语句附加到您的 sql

LOG ERRORS INTO err$_dest ('INSERT') REJECT LIMIT UNLIMITED;

3) 现在查看错误

SELECT ora_err_number$, ora_err_mesg$
FROM   err$_dest
WHERE  ora_err_tag$ = 'INSERT';

【讨论】:

以上是关于忽略 jdbc 批处理中的错误语句的主要内容,如果未能解决你的问题,请参考以下文章

Java JDBC中的批处理SQL语句的详解

JDBC_批量处理SQL语句

Java JDBC中的批处理SQL语句的详解

JDBC 中的事务和批处理 batch

Java JDBC 如何使用 RETURNING 语句处理更新查询

java异常处理中的return语句[重复]