2013-03-28 17 views
10

Sto inserendo molti record utilizzando gli inserimenti batch JDBC. C'è un modo per ottenere la chiave generata per ogni record? Posso utilizzare ps.getGeneratedKeys() con inserti batch?Come ottenere le chiavi generate dall'inserimento batch JDBC in Oracle?

Sto usando oracle.jdbc.OracleDriver

final String insert = "Insert into Student(RollNumber, Name, Age) values(StudentSEQ.nextval, ? , ?)"; 
final int BATCH_SIZE = 998; 
int count = 0; 
Connection con = null; 
PreparedStatement ps = null; 
try { 
    con = getConnection(); 
    ps = con.prepareStatement(insert); 
    for (Student s : students) { 
     ps.setString(1, s.getName()); 
     ps.setInt(2, s.getAge()); 
     ps.addBatch(); 
     count++; 
     if (count % BATCH_SIZE == 0) { 
     // Insert records in batches 
      ps.executeBatch(); 
     } 
    } 
    // Insert remaining records 
    ps.executeBatch(); 
} finally { 
    if(ps != null) 
     ps.close(); 
    release(con); 
} 

Sto pensando di utilizzare ps.executeUpdate() insieme ps.getGeneratedKeys() all'interno del ciclo per ottenere il risultato desiderato. Qualche altra soluzione?

+1

Usi le sequenze negli inserti batch? – Rachcha

+0

Sì, StudentSEQ è la sequenza per la tabella. – atripathi

risposta

6

La JDBC 4.1 specification, sezione 13,6 Recupero Auto valori generati dice:

È definito dall'implementazione sul fatto getGeneratedKeys tornerà valori generati dopo aver richiamato il metodo executeBatch.

Quindi è necessario verificare se il driver in realtà lo supporta per gli aggiornamenti batch. Come indicato nella the answer by Philip O., recupero di chiavi generate non è supportata con aggiornamenti batch come documentato in Oracle 12 JDBC Standards Support:

Non è possibile combinare le chiavi auto-generate con aggiornamento batch.

In ogni caso se è supportata dal driver di vostra dichiarazione di preparare dovrebbe essere cambiata per il codice qui sotto per indicare al conducente di recuperare le chiavi generate:

ps = con.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS); 

Nota: potrebbe essere necessario utilizzare una delle altre chiavi generate prepara i metodi (prepareStatement(sql, columnIndexes) o prepareStatement(sql, columnNames)) poiché Oracle restituirà lo ROW_ID con il metodo nel mio esempio.

Problemi correlati