我有代码在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)
答案 0 :(得分:2)
使用Oracle时,无法告诉驱动程序在发生错误时继续执行批处理(您的A不可能)。但是您可以捕获BatchUpdateException并调用getUpdateCounts()以了解哪些行已成功执行。该异常还将从数据库服务器返回错误消息。
答案 1 :(得分:0)
以下可以在Oracle中实现
1)创建错误记录表。
asum
2)将以下语句附加到您的sql
Nothing
3)现在研究错误
BEGIN
DBMS_ERRLOG.create_error_log (dml_table_name => 'dest');
END;
/