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

标签 java oracle jdbc spring-jdbc

我有一个执行批量更新语句的批处理。

在使用 Spring JDBC 4.1.6 和 Oracle Jdbc 驱动程序(ojdbc7 和 ucp)实现批处理支持后,单个更新请求(在批处理中)受影响的记录数始终检索为 -2(Statement.SUCCESS_NO_INFO)。

有什么方法可以知道单个更新请求(批量设置的参数)影响的行,因为在此之后我必须使用 INSERT 语句重试相同的参数??

技术上尝试将其开发为 UPSERT 实现

我用三种不同的方式尝试了这个批量更新,并且在所有三种方法中结果都是相同的——(它只是告诉我 Statement.SUCCESS_NO_INFO (-2) )

方法一——直接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);  

方法三——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();
         }
  }

最佳答案

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

所以从 12.1 开始:

int updatedRows[] = pstmt.executeBatch();

实际上会返回一个数组,其中包含批处理中每个元素的更新行数,而不是 -2。顺便说一句,此功能仅在 JDBC 瘦驱动程序中。

关于java - 受影响的 Oracle JDBC batchUpdate 行始终为 -2 (Statement.SUCCESS_NO_INFO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296592/

相关文章:

java - Quarkus Rest Client 不在 ClientHeadersFactory 的实现中注入(inject) ConfigProperty

Java如何设置SSL连接客户端-服务器

java - 如何在不阻塞计时器(Java Swing)的情况下暂停程序执行?

oracle - 如何在 Ubuntu 9.x 上正确设置 ORACLE_HOME 变量?

java - 为什么以函数作为参数时 jdbi 绑定(bind)失败

java - 在java中从IP地址捕获数据包详细信息

sql - 如何在 SQL Developer 中将多个表中的数据导出到多个 .TXT 文件中

mysql - 如何将两个 SQL 查询合并到一个查询中

java - Sonarqube 抛出 MySQL 的 JDBCError

java - Firebird + JDBC : Getting the generated key from an insert