2015-03-27 5 views
7

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

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 –

Antwort

6

Ab 12.1, die Oracle Database gibt die Anzahl der aktualisierten Zeilen für jedes Element des Stapels. Sie benötigen eine 12.1 Datenbank und einen Treiber (12.1.0.2). Diese Funktion ist in früheren Versionen der Datenbank nicht vorhanden.

Ausgang So in 12.1:

int updatedRows[] = pstmt.executeBatch(); 

tatsächlich eine Anordnung gibt die Anzahl der aktualisierten Zeilen für jedes Element in der Charge, anstatt -2 enthält. BTW diese Funktion ist nur in der JDBC-Thin-Treiber.