我有一个批处理过程,它执行Bulk UPDATE语句。
使用Spring JDBC 4.1.6和Oracle Jdbc Driver(ojdbc7和ucp)实现批量支持后,对各个更新请求(批处理)中受影响的记录数始终检索为-2(Statement.SUCCESS_NO_INFO)。 / p>
有没有办法知道各个更新请求受影响的行(批量设置的参数),因为我必须在此之后用INSERT语句重试相同的参数?
从技术上讲,尝试将其作为UPSERT实施进行开发
我尝试了三种不同方式的批量更新,并且在所有三种方法中结果都相同 - (它只是告诉我Statement.SUCCESS_NO_INFO(-2))
方法1 - 直接UCP连接和PreparedStatement
connectionPoolMgr.startConnectionPool("mgr_pool");
Connection connection = pds.getConnection();
PreparedStatement pstmt = connection.prepareStatement(dmlSQL);
pstmt.setInt(1, pkId);
pstmt.setInt(2, idx * 10);
pstmt.addBatch();
// EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2
int updatedRows[] = pstmt.executeBatch();
方法2 - Spring JdbcTemplate和batchUpdate()
MapSqlParameterSource[] paramsArray = getSqlParameterList().toArray(new MapSqlParameterSource[0]);
// EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2
int[] batchUpdateResult = getNamedParameterJdbcTemplate().batchUpdate(sqlStatement, paramsArray);
方法3 - Spring BatchSqlUpdate实现
BatchInsert batchInsert = new BatchInsert(dataSource);
for (int i = 0; i < count; i++) {
MapSqlParameterSource param = new MapSqlParameterSource();
param.addValue("ID", i + 100);
param.addValue("FIRST_NAME", "Name" + i);
batchInsert.updateByNamedParam(param.getValues());
}
batchInsert.flush();
int rowsAffected[] = batchInsert.getRowsAffected();
class BatchInsert extends BatchSqlUpdate {
private static final String SQL = "UPDATE t_customer_test SET first_name = :FIRST_NAME) WHERE id = :ID";
BatchInsert(DataSource dataSource) {
super(dataSource, SQL);
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.INTEGER));
setBatchSize(100);
compile();
}
}
答案 0 :(得分:9)
从12.1开始,Oracle数据库返回批处理的每个元素的更新行数。您将需要12.1数据库和驱动程序(12.1.0.2)。此功能在早期版本的数据库中不存在。
从12.1开始:
int updatedRows[] = pstmt.executeBatch();
实际上,将返回一个数组,其中包含批处理中每个元素的更新行数,而不是-2。 BTW此功能仅在JDBC瘦驱动程序中使用。