2017-05-03 117 views
1

我有代碼來執行批處理插入到SqlServer或Oracle表中。我怎麼能告訴JDBC來
A)一直走,如果insert語句的一個失敗
b)通知我哪一個有問題忽略jdbc批處理中的錯誤語句

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()來知道哪些行成功執行。該異常還會從數據庫服務器返回錯誤消息。

+0

這是我的解決方案。我捕獲異常,記錄它,跳過壞行,並且使用基於UpdateCount的子列表遞歸。謝謝! – Steve