繁体   English   中英

Teradata JDBC executeBatch错误处理

[英]Teradata JDBC executeBatch errorhandling

我正在使用executeBatch方法将数据插入到Teradata表中。 当前,如果批次中的一个插入失败,则批次中的所有其他插入也会失败,并且最终不会插入任何记录。 如果任何插入失败并且具有跟踪拒绝记录的某些功能,如何更改此行为以使批处理中的其他插入成功。

PS:我确保将TMODE设置为TERA并启用自动提交。

更新:

目标表定义。

Class.forName("com.teradata.jdbc.TeraDriver");
val conn = DriverManager.getConnection("jdbc:teradata://teradata-server/mydb,tmode=TERA","username","password")
val insertSQL =  "INSERT INTO mydb.mytable VALUES (?,?)"
val stmt = conn.prepareStatement(insertSQL)


stmt.setInt(1,1)
stmt.setNull(2,Types.VARCHAR)  // Inserting Null here. This insert will fail
stmt.addBatch()

stmt.setInt(1,2)
stmt.setString(2,"XXX")
stmt.addBatch()

stmt.setInt(1,3)
stmt.setString(2,"YYY")
stmt.addBatch()

stmt.setInt(1,4)
stmt.setString(2,"ZZZ")
stmt.addBatch()

stmt.setInt(1,5)
stmt.setString(2,"ABC")
stmt.addBatch()

try {
val res = stmt.executeBatch()
println(res.mkString(","))
}
catch {
 case th: BatchUpdateException => {
        println(th.getUpdateCounts().mkString(","))
 }
}

以下是示例Scala代码。 如您所见,该批处理包含5个insert语句。 第一次插入设置为失败,因为它试图将null插入非null字段(col2)。 其他4个插入没有任何问题,应该会成功。 但是正如您从下面看到的,该批次中的所有5个插入操作均失败。 有什么方法可以使其他插入成功? 如上所述,tmode是tera,并且启用了自动提交。 如果除了单独重新提交所有失败的查询之外别无选择,那么我们将不得不减小批处理大小并为较低的吞吐量做好准备。

 Class.forName("com.teradata.jdbc.TeraDriver"); val conn = DriverManager.getConnection("jdbc:teradata://teradata-server/mydb,tmode=TERA","username","password") val insertSQL = "INSERT INTO mydb.mytable VALUES (?,?)" val stmt = conn.prepareStatement(insertSQL) stmt.setInt(1,1) stmt.setNull(2,Types.VARCHAR) // Inserting Null here. This insert will fail stmt.addBatch() stmt.setInt(1,2) stmt.setString(2,"XXX") stmt.addBatch() stmt.setInt(1,3) stmt.setString(2,"YYY") stmt.addBatch() stmt.setInt(1,4) stmt.setString(2,"ZZZ") stmt.addBatch() stmt.setInt(1,5) stmt.setString(2,"ABC") stmt.addBatch() try { val res = stmt.executeBatch() println(res.mkString(",")) } catch { case th: BatchUpdateException => { println(th.getUpdateCounts().mkString(",")) } } 

结果

-3,-3,-3,-3,-3

这来自Teradata的JDBC手册

从Teradata数据库13.10和Teradata JDBC驱动程序13.00.00.16开始,PreparedStatement批处理执行可以为每个参数集返回单独的成功和错误条件。

使用PreparedStatement executeBatch方法的应用程序必须具有BatchUpdateException的catch块,并且该应用程序必须检查BatchUpdateException getErrorCode方法返回的错误代码。

PreparedStatement BatchUpdateException处理

使用PreparedStatement批处理请求执行多语句请求,并演示PreparedStatement BatchUpdateException的处理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM