2016-08-02 7 views
-1

UPSERT_DELETE_JOB_COUNTERS가 업데이트되었습니다. 이제 "업서 트"가 새로운 쿼리 =와 함께 작동한다고 생각하십니까? 아니면 어떻게 생각하십니까?열 인덱스가 범위를 벗어났습니다. 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)'문제의 원인이라고 생각 : PostgreSQL의 이전 버전

, 당신은 아마이 의사 코드 샘플과 같은 “ 무한 루프 ”를 코딩해야합니다 . 이 캐시 된 결과 집합에 실제로 두 개의 열을 사용할 수 있습니까? –

+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?,? ,? 어디 존재하지 않습니다 (선택 1 FROM rating.delete_job_counters 어디 fee_group_id =? 및 delete_job_id =?); '이 쿼리는 괜찮습니까? 첫 번째 테스트는 긍정적이었습니다. – user3181885

답변

-1

당신은 DO 문을 매개 변수화 java.sql.PreparedStatement을 사용할 수 없습니다.

INSERT ... ON CONFLICT DO UPDATE (PostgreSQL 9.5부터 사용 가능)을 사용하지 않는 이유는 무엇입니까?

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

우리는 PostgresSql 9.4 = (다른 생각이 있습니까? – user3181885

+0

나는 대답을 편집 했으므로 그것이 유일한 옵션이라고 생각합니다. –