忽略 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 批处理中的错误语句的主要内容,如果未能解决你的问题,请参考以下文章