Ho un processo batch che esegue l'istruzione Bulk UPDATE.Le righe di Oracle JDBC batchUpdate interessate sono sempre -2 (Statement.SUCCESS_NO_INFO)
Dopo aver implementato il supporto batch utilizzando Spring JDBC 4.1.6 e Oracle Jdbc Driver (ojdbc7 e ucp), il numero di record interessati per singole richieste di aggiornamento (nel batch) viene sempre recuperato come -2 (Statement.SUCCESS_NO_INFO).
C'è un modo per conoscere le righe interessate per singole richieste di aggiornamento (argomento impostato in batch), come devo ripetere lo stesso argomento con un'istruzione INSERT dopo questo ??
Tecnicamente cercando di sviluppare questo come un'implementazione UPSERT
ho provato questo aggiornamento batch in tre modi diversi, e in tutti e tre i metodi i risultati sono gli stessi - (E 'appena mi dice Statement.SUCCESS_NO_INFO (-2))
Metodo 1 - Collegamento diretto UCP e 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();
Metodo 2 - Primavera JdbcTemplate e batchUpdate()
MapSqlParameterSource[] paramsArray = getSqlParameterList().toArray(new MapSqlParameterSource[0]);
// EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2
int[] batchUpdateResult = getNamedParameterJdbcTemplate().batchUpdate(sqlStatement, paramsArray);
Metodo 3 - implementazione Primavera 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();
}
}
Ha fatto la stessa domanda sulla rete OTN e ha ottenuto alcune risposte utili. Attualmente sto cercando di implementarlo come UPSERT utilizzando l'istruzione MERGE. Link: https://community.oracle.com/message/12980203 –