我正在使用JDBC和Oracle11的应用程序上工作。
我的表中有成千上万的记录,tbltest
这些记录是通过JDBC批处理执行的。因此,将其视为一个id =一个查询。
我的要求:我想跟踪哪些id
已成功更新,哪些在数据库中不存在。
以下是我的代码:
String sql = "UPDATE TBLTEST SET STATUS = 'CANCEL' WHERE ID = ?"; PreparedStatement preparedStatement = null; Connection connection = getConnection(); // I'm getting this connection properly preparedStatement = connection.prepareStatement(sql); for (String id : idList) { // idList is a List of String being passed to my method preparedStatement.setString(1, id); preparedStatement.addBatch(); } int[] affectedRecords = preparedStatement.executeBatch(); System.out.println("Records affected:"+Arrays.toString(affectedRecords)); int success = preparedStatement.getUpdateCount(); System.out.println(success + " Total updated");
我的记录已按照idList
提供的内容成功更新。根据此 Javadoc,在中affectedRecords
,我应该得到实际的编号。每个更新查询更新的记录总数,因为我没有任何异常。相反,我只affectedRecords
用-2填充了数组。因此,如果idList
包含5个元素:
实际输出:
Records affected: [-2, -2, -2, -2, -2] 5 Total updated
预期产量:
Records affected: [1, 1, 1, 1, 1] 5 Total updated
我在互联网上搜索了此问题,并遇到了一些类似这样的帖子:https : //community.oracle.com/thread/3691652 ? start =0 & tstart =0 https://community.oracle.com/thread/1046798?tstart=0
但是这些帖子中提供的解决方案也无济于事,因为我已经在使用ojdbc6.jar。
那么,有什么解决方案或替代方案吗?
我终于找到了。问题与有关PreparedStatement
。
根据Oracle的Javadoc,在使用时,无法获得受每个查询影响的记录数PreparedStatement
。因此,当我将代码转换为Statement
完美时。
参考说明:
Oracle标准批处理实现中的更新计数如果成功处理了一个语句批处理,则该语句executeBatch调用返回的整数数组或更新计数数组对于该批处理中的每个操作将始终具有一个元素。在标准更新批处理的Oracle实现中,数组元素的值如下:
对于准备好的语句批处理,不可能知道该批处理中每个单独的语句在数据库中影响的行数。因此,所有数组元素的值都为-2。根据JDBC 2.0规范,值-2表示操作成功,但是受影响的行数未知。
对于通用语句批处理,该数组包含实际更新计数,这些计数指示受每个操作影响的行数。仅在标准批处理的Oracle实现中使用通用语句时才能提供实际更新计数。
对于可调用语句批处理,服务器始终返回值1作为更新计数,而不管受每个操作影响的行数。