2016-08-02 36 views
-1

我更新了UPSERT_DELETE_JOB_COUNTERS。 現在我認爲「upsert」與新的Query =一起工作)或者你認爲如何?列索引超出範圍:1,列數:0

問候, 彼得

`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

我相信'deleteCdr.getInt(2)'是問題的原因。你確定這個緩存結果集實際上有兩列嗎? –

+0

與您的問題沒有直接關係,但需要關閉「Statement」和「Connection」。考慮[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 – bradimus

+0

'UPDATE rating.delete_job_counters SET delete_count = delete_count +?在哪裏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 =?); '這個查詢好嗎?我的第一個測試是積極的。 – user3181885

回答

-1

不能使用參數化java.sql.PreparedStatementDO聲明。

爲什麼不使用INSERT ... ON CONFLICT DO UPDATE(自PostgreSQL 9.5以後可用)?

對於舊版本的PostgreSQL,你可能有這樣的僞代碼樣本代碼的「無限循環」:

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

我們有PostgresSql 9.4 =(你有另一個想法嗎? – user3181885

+0

我已經編輯了答案;我想這是你唯一的選擇。 –