2016-08-02 20 views
-1

Ich habe die UPSERT_DELETE_JOB_COUNTERS aktualisiert. Jetzt denke ich, dass die "upsert" mit der neuen Query funktioniert =) Oder was denkst du?Der Spaltenindex liegt außerhalb des Bereichs: 1, Anzahl der Spalten: 0

Grüßen, Peter

`private static final String UPSERT_DELETE_JOB_COUNTERS = 
     "UPDATE rating.delete_job_counters SET delete_count = delete_count + ? WHERE fee_group_id = ? AND delete_job_id = ?; "+ 
     "INSERT INTO rating.delete_job_counters(delete_job_id, fee_group_id, delete_count) "+ 
     "SELECT ?, ? , ? " + 
     "WHERE NOT EXISTS (SELECT 1 FROM rating.delete_job_counters WHERE fee_group_id = ? AND delete_job_id = ?); "; 

@Override 
public Boolean insertIntoDeleteStatistic(final CachedRowSet deletedEntries, 
             Long deleteJobId, 
             Transaction transaction) throws SQLException { 
    boolean finish = true; 
    if (deletedEntries.size() == 0) { 
     return finish; 
    } 
    final Connection connection = transaction.getConnection(); 
    final Timer executeTimer = Timer.start("Insert took "); 
    try { 
     PreparedStatement pstmt = connection.prepareStatement(UPSERT_DELETE_JOB_COUNTERS); 
     while (deletedEntries.next()) { 
      pstmt.setInt(1, deletedEntries.getInt(2)); 
      pstmt.setInt(2, deletedEntries.getInt(1)); 
      pstmt.setLong(3, deleteJobId); 
      pstmt.setLong(4, deleteJobId); 
      pstmt.setInt(5, deletedEntries.getInt(1)); 
      pstmt.setInt(6, deletedEntries.getInt(2)); 
      pstmt.setInt(7, deletedEntries.getInt(1)); 
      pstmt.setInt(8, deletedEntries.getInt(2)); 
      pstmt.execute(); 
     }... 

`

+1

Ich glaube, dass 'deleteCdr.getInt (2)' ist die Ursache des Problems . Sind Sie sicher, dass dieses zwischengespeicherte Ergebnis tatsächlich zwei Spalten enthält? –

+0

Nicht direkt mit Ihrem Problem verbunden, aber Sie müssen Statement und Connection schließen. Ziehen Sie [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) in Betracht. – bradimus

+0

'UPDATE rating.delete_job_counters SET delete_count = delete_count +? WHERE Gebühr_Gruppen_ID =? UND delete_job_id =?; INSERT in rating.delete_job_counters (delete_job_id, fee_group_id, delete_count) SELECT?,? ,? WHERE NICHT EXISTIERT (SELECT 1 VON rating.delete_job_counters WHERE fee_group_id =? UND delete_job_id =?); 'Ist diese Frage Ok? Mein erster Test war positiv. – user3181885

Antwort

-1

Sie nicht eine parametrisierte java.sql.PreparedStatement mit einer DO Anweisung verwenden können.

Warum verwenden Sie nicht INSERT ... ON CONFLICT DO UPDATE (verfügbar seit PostgreSQL 9.5)?

Bei älteren Versionen von PostgreSQL, werden Sie wahrscheinlich eine “ Endlosschleife ” wie dieser Pseudo-Code Beispielcode müssen:

while (1) { 
    INSERT ... 
    if (insert went ok) break; 
    UPDATE ... 
    if (update changed one row) break; 
} 
+0

Wir haben PostgresSql 9.4 = (Haben Sie eine andere Idee? – user3181885

+0

Ich habe die Antwort bearbeitet; ich denke, das ist Ihre einzige Option. –