2016-08-02 13 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)'問題の原因であると信じています。このキャッシュされた結果セットには、実際には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?、? 、? どこに存在しないのですか?(rating_level_job_countersからどれか1を選択してください?fee_group_id =?およびdelete_job_id =?); 'この質問はOKですか?私の最初のテストは肯定的でした。 – user3181885

答えて

-1

あなたはDO文でパラメータ化java.sql.PreparedStatementを使用することはできません。

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

私は答えを編集しました;私はそれがあなたの唯一のオプションだと思います。 –

関連する問題