当前位置: 首页 > 知识库问答 >
问题:

受影响的Oracle JDBC batchUpdate行始终为-2(Statement.SUCCESS\u NO\u INFO)

伯博
2023-03-14

我有一个批量更新语句的批处理过程。

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

有没有办法知道受单个更新请求影响的行(参数成批设置),因为我必须在这之后用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 JdbcTemboard和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个答案

百里鸿祯
2023-03-14

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

从12.1开始:

int updatedRows[] = pstmt.executeBatch();

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

 类似资料:
  • 问题内容: 如何访问受以下因素影响的行数: 问题答案: 尝试使用: 将包含一个元素为的元组。因此找到行数: 或者,如果您愿意一口气做到这一点: PS。最好在可能的情况下使用参数化的参数,因为它可以在需要时自动为您引用参数,并防止sql注入。 参数化参数的正确语法取决于您的python /数据库适配器(例如mysqldb,psycopg2或sqlite3)。它看起来像

  • 问题内容: 我目前正在从事C#项目,并且正在运行一个插入查询,该查询也同时进行选择,例如: 有没有一种方法可以查看此查询期间插入了多少行? 问题答案: -返回受影响的行数。

  • 问题内容: 我有这个查询: 我的表是,我有一列名为。我要更新的是名为“ yes” 的列。 知道我在做什么错吗?当我返回查询时,它说受影响的0行。 问题答案: 如苯丙胺和Yada所建议,如果您的电话号码在表中,请使用进行检查。 但是请记住:如果所讨论的行的值已经是“是”,则mysql不会更改该值,因此将返回“受影响的0行”。因此,请务必同时检查

  • 问题内容: 我发现有很多方法可以将exec语句用于PDO,但是我不确定它是否对我有帮助。我的理解是我必须对准备好的语句使用execute()函数。我正在使用来自用户输入的数据更新一行,因此我想使用一个准备好的语句而不是query()调用。 我的代码如下: 问题是查询本身没有错误并且可以正常执行,因此在$ f中存储没有错误。但是,我需要知道它是否确实找到要更新的行,然后成功更新了它。换句话说,我需要

  • 问题内容: 这是我的代码 为假,但在数据库中插入该行以及我指定的所有信息 我手动重建查询以查看问题是否来自查询。参数,它再次无错误地插入数据库,但insertOk仍然为false!我什至还添加了另外两个不应该为空的字段,但是两种情况下的活动都是相同的 有任何想法吗? 问题答案: 对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 当要插入或更新的表上存在触发器时,返回值包

  • 问题内容: 使用php / mysql如何获取查询影响的行数? 到目前为止我尝试过的是: 但它表示警告:mysql_num_rows():提供的参数不是有效的MySQL结果资源 问题答案: 如果您使用的是PDO(我建议使用PDO),则直接查询将返回受影响的行数。对于Prepared Statements, 有一个称为的方法。 如果您使用的是mysql函数,则有。 编辑: 似乎您正在使用mysql函