Ich habe einen Batch-Prozess, der Bulk UPDATE-Anweisung.Oracle JDBC batchUpdate Zeilen betroffen ist immer -2 (Statement.SUCCESS_NO_INFO)
Nach der Implementierung der Stapelunterstützung mit Spring JDBC 4.1.6 und Oracle Jdbc Driver (ojdbc7 und ucp) wird die Anzahl der betroffenen Datensätze für einzelne Aktualisierungsanforderungen (im Stapel) immer als -2 (Statement.SUCCESS_NO_INFO) abgerufen.
Gibt es eine Möglichkeit zu wissen, die betroffenen Zeilen für einzelne Update-Anfragen (Argument im Stapel gesetzt), wie ich das gleiche Argument mit einer INSERT-Anweisung danach erneut versuchen ??
Technisch sind die Ergebnisse derselben zu entwickeln, das als UPSERT Implementierung
Ich habe versucht, diese Batch-Update auf drei verschiedene Arten und in allen drei Methoden versuchen - (Es sagt mir nur Statement.SUCCESS_NO_INFO (-2))
Methode 1 - Direkter UCP Anschluss und 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();
Methode 2 - Frühling JdbcTemplate und batchupdate()
MapSqlParameterSource[] paramsArray = getSqlParameterList().toArray(new MapSqlParameterSource[0]);
// EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2
int[] batchUpdateResult = getNamedParameterJdbcTemplate().batchUpdate(sqlStatement, paramsArray);
Methode 3 - Frühling BatchSqlUpdate Implementierung
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();
}
}
Fragte die gleiche Frage auf OTN-Netzwerk und erhielt einige nützliche Antworten. Derzeit versuche ich dies als UPSERT mit MERGE-Anweisung zu implementieren. Link: https://community.oracle.com/message/12980203 –