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

Tsql 忽略jdbc批处理中的错误语句,tsql,jdbc,groovy,plsql,Tsql,Jdbc,Groovy,Plsql,我有代码可以批量插入SqlServer或Oracle表。如果其中一条insert语句失败,我如何告诉JDBC继续运行 B) 告诉我哪个有问题 sql.withBatch("""Insert Into ${job.table}($columnNames)Values(${values})""") { stmt -> data.each{ Map<String, String> row -> stmt.addBatch(newMap) } }

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

sql.withBatch("""Insert Into ${job.table}($columnNames)Values(${values})""") { stmt ->
    data.each{ Map<String, String> row ->
        stmt.addBatch(newMap)
    }
}
sql.withBatch(““”插入${job.table}(${columnNames)值(${Values})”){stmt->
数据。每个{映射行->
stmt.addBatch(newMap)
}
}
当前,如果其中一行出现问题,它将成功插入之前的所有内容,然后停止插入行。它会告诉我错误信息,但不会告诉我是什么数据导致了错误。java或groovy中的解决方案都可以


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

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

以下内容可以在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';

这是我的解决方案。我捕获异常,记录它,跳过坏行,并根据UpdateCount使用子列表递归。谢谢