当前位置:  开发笔记 > 编程语言 > 正文

ORACLE JDBC批处理执行不返回受影响的行的实际计数

如何解决《ORACLEJDBC批处理执行不返回受影响的行的实际计数》经验,为你挑选了1个好方法。

我正在使用JDBCOracle11的应用程序上工作。

我的表中有成千上万的记录,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

那么,有什么解决方案或替代方案吗?



1> RAS..:

我终于找到了。问题与有关PreparedStatement

根据Oracle的Javadoc,在使用时,无法获得受每个查询影响的记录数PreparedStatement。因此,当我将代码转换为Statement完美时。

参考说明:

Oracle标准批处理实现中的更新计数如果成功处理了一个语句批处理,则该语句executeBatch调用返回的整数数组或更新计数数组对于该批处理中的每个操作将始终具有一个元素。在标准更新批处理的Oracle实现中,数组元素的值如下:

对于准备好的语句批处理,不可能知道该批处理中每个单独的语句在数据库中影响的行数。因此,所有数组元素的值都为-2。根据JDBC 2.0规范,值-2表示操作成功,但是受影响的行数未知。

对于通用语句批处理,该数组包含实际更新计数,这些计数指示受每个操作影响的行数。仅在标准批处理的Oracle实现中使用通用语句时才能提供实际更新计数。

对于可调用语句批处理,服务器始终返回值1作为更新计数,而不管受每个操作影响的行数。

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有