受影响的Oracle JDBC batchUpdate行始终为-2(Statement.SUCCESS_NO_INFO)

时间:2015-03-27 08:52:11

标签: java oracle jdbc spring-jdbc

我有一个批处理过程,它执行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();
         }
  }

1 个答案:

答案 0 :(得分:9)

从12.1开始,Oracle数据库返回批处理的每个元素的更新行数。您将需要12.1数据库和驱动程序(12.1.0.2)。此功能在早期版本的数据库中不存在。

从12.1开始:

int updatedRows[] = pstmt.executeBatch();
实际上,

将返回一个数组,其中包含批处理中每个元素的更新行数,而不是-2。 BTW此功能仅在JDBC瘦驱动程序中使用。