Les lignes Oracle JDBC batchUpdate concernées ont toujours la valeur -2 (Statement.SUCCESS_NO_INFO).

J’ai un processus de traitement par lots qui effectue une instruction Bulk UPDATE.

Après avoir implémenté le support par lots à l’aide de Spring JDBC 4.1.6 et du pilote Oracle Jdbc (ojdbc7 et ucp), le nombre d’enregistrements affectés aux demandes de mise à jour individuelles (dans le lot) est toujours extrait sous la forme -2 (Statement.SUCCESS_NO_INFO).

Existe-t-il un moyen de connaître les lignes affectées par les demandes de mise à jour individuelles (argument défini par lot), car je dois réessayer le même argument avec une instruction INSERT après cela?

Essayer techniquement de développer cela comme une implémentation UPSERT

J’ai essayé cette mise à jour par lots de trois manières différentes et, dans les trois méthodes, les résultats sont identiques – (Il me dit simplement Statement.SUCCESS_NO_INFO (-2))

Méthode 1 – Connexion directe UCP et 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(); 

Méthode 2 – Spring JdbcTemplate et batchUpdate ()

  MapSqlParameterSource[] paramsArray = getSqlParameterList().toArray(new MapSqlParameterSource[0]); // EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2 int[] batchUpdateResult = getNamedParameterJdbcTemplate().batchUpdate(sqlStatement, paramsArray); 

Méthode 3 – Implémentation 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(); } } 

À partir de 12.1, la firebase database Oracle renvoie le nombre de lignes mises à jour pour chaque élément du lot. Vous aurez besoin d’une firebase database 12.1 et d’un pilote (12.1.0.2). Cette fonctionnalité n’existe pas dans les versions précédentes de la firebase database.

Donc à partir de 12.1:

 int updatedRows[] = pstmt.executeBatch(); 

renverra en fait un tableau contenant le nombre de lignes mises à jour pour chaque élément du lot au lieu de -2. BTW cette fonctionnalité est uniquement dans le pilote léger JDBC.