我有一个批量更新语句的批处理过程。
使用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();
}
}
从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函