2015-03-27 13 views
7

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(); 
     } 
    } 
+0

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 –

risposta

6

A partire dal 12.1, Oracle Database restituisce il numero di righe aggiornate per ogni elemento del lotto. Avrai bisogno di un database e driver 12.1 (12.1.0.2). Questa funzione non esiste nelle versioni precedenti del database.

Così partire dal 12.1:

int updatedRows[] = pstmt.executeBatch(); 

sarà effettivamente restituire una matrice contenente il numero di righe aggiornate per ciascun elemento nel batch invece di -2. BTW questa funzione è solo nel driver sottile JDBC.

Problemi correlati