2016-04-07 15 views
2

PreparedStatementを使用してレコードを更新する必要がある割り当てがあります。レコードが更新されると、更新クエリの戻りカウント、つまり影響を受けた行の数がわかります。JDBCのUPDATEクエリの影響を受けるすべての行を取得する方法は?

ただし、カウントの代わりに、応答で更新クエリの影響を受けた行、または少なくとも影響を受けた行のID値の一覧が必要です。

この更新クエリです。

UPDATE User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?; 

通常、影響を受ける行の数を返しますが、私の場合は、行のIDまたは影響を受けるすべての行を戻す必要があります。

私はPostgreSQLのreturning機能を使用していますが、その場合は役に立ちますが、私にとっては役に立ちません。

+1

同じパラメータでselect文を実行するだけで、それ以降は更新を行うことができます。 –

+0

コメントありがとうございますが、一度私の更新クエリを実行すると結果セットを返す必要があります – Rahul

+0

その後、最初のselectステートメントからIDを取得し、更新を行い、IDを取得したselectステートメントを実行します。更新ステートメントは、常に影響を受けた行の数を返します –

答えて

4

私は、PostgreSQLの返す関数を使用するが、それがあるべき私

ために有用ではありませんしています。おそらくあなたはそれを間違って使用していたかもしれません。このコードは、私の作品:

sql = "UPDATE table1 SET customer = customer || 'X' WHERE customer LIKE 'ba%' RETURNING id"; 
try (PreparedStatement s = conn.prepareStatement(sql)) { 
    s.execute(); // perform the UPDATE 
    try (ResultSet rs = s.getResultSet()) { 
     // loop through rows from the RETURNING clause 
     while (rs.next()) { 
      System.out.println(rs.getInt("id")); // print the "id" value of the updated row 
     } 
    } 
} 

documentationは、私たちがResultSet全体更新された行を含めたい場合は、我々はまた、RETURNING *を使用できることを示しています。

更新:

@CraigRingerが彼のコメントで示唆するように、PostgreSQLのJDBCドライバは、実際にあまりにもUPDATEステートメントの.getGeneratedKeys()をサポートしていないので、このコードは同様に私の仕事:

sql = "UPDATE table1 SET customer = customer || 'X' WHERE customer LIKE 'ba%'"; 
try (PreparedStatement s = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { 
    s.execute(); // perform the UPDATE 
    try (ResultSet rs = s.getGeneratedKeys()) { 
     while (rs.next()) { 
      System.out.println(rs.getInt(1)); // print the "id" value of the updated row 
     } 
    } 
} 

感謝を、クレイグ!

+0

'RETURNING'は直接使用できますが、必要はありません。 JDBC生成キーインタフェースを使用すると、標準JDBC APIを介して同じ情報を要求できます。 (ああ、スペックはINSERT以外のクエリでは無視されると言っているが、気にしない)。 –

+1

@CraigRingerそうでないと、JDBC 4.2(セクション13.6)は次のように述べています。_ "JDBCドライバは、SQL INSERT文の自動生成された値の戻りをサポートしなければなりません。 _。つまり、INSERTにはサポートが必要です。他のDMLではオプションです。しかし、API文書の文言は混乱しているようです。 –

+0

RETURNINGはポストのためだけです。RETURNING節でうまく動作しようとしましたが、他の解決策が必要です。残念なことに、彼女のことは私の仕事ではないと言われています。 – Rahul

3

生成されたキーの取得にJDBCのサポートを使用できる場合があります。 Connection.prepareStatement(String sql, int[] columnIndexes) APIメソッドを参照し、Statement.getGeneratedKeys()を使用して結果にアクセスします。

仕様は言い「SQL文がINSERT文でない場合、ドライバは配列を無視します」しかし、私は、PostgreSQLのJDBCドライバが実際にあまりにも他の種類の文を使用して要求を尊重すると思います。

ゴードトンプソンで説明するよう

PreparedStatement s = conn.prepareStatement(sql, new String[] {'id'}) 
s.executeUpdate(); 
ResultSet rs = s.getGeneratedKeys(); 

そうでない場合は、RETURNINGを使用しています。

+1

ドキュメントは_ SQLステートメントは、INSERTステートメント、**または自動生成キーを返すことができるSQLステートメントではありません(このようなステートメントのリストはベンダー固有です)。** _ _の前にカンマがあると、しかし、それは 'INSERT'以外の文ではサポートされていることを意味します。 –

+0

ええと、IIRC PgJDBCは、生成されたキーを使って 'PrepareStatement'を介して送信するものにほとんど' RETURNING'を盲目的に追加します。構文的に無意味なものを含みます。 –

+0

私はJaybird/Firebirdと同じ問題を抱えていました。一部のアプリケーション(ColdFusionを見て)では、クエリの場合でも常にStatement.RETURN_GENERATED_KEYSを使用することが判明しています。 –

1

は、列名または列のインデックスの配列を渡すことによってそれ 1を行う双方向ありprepareStatement すなわちconn.prepareStatement(SQL、新しいString [] {「ID」、「のuname」}) と 2. prepareStatementにStatement.RETURN_GENERATED_KEYSを使用します。

私のコードは、これは私の要件として私は自分のコードを開発したより良いアイデアを探すことができます。

private static final String UPDATE_USER_QUERY= "UPDATE User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;"; 
//pst = connection.prepareStatement(UPDATE_USER_QUERY,columnNames); 
pst = connection.prepareStatement(UPDATE_USER_QUERY,Statement.RETURN_GENERATED_KEYS); 
ResultSet rst = pst.getGeneratedKeys(); 
List<UserInformation> userInformationList = new ArrayList<UserInformation>(); 
UserInformation userInformation; 

while (rst.next()){ 
userInformation = new UserInformation(); 

userInformation.setUserId(rst.getLong("user_id")); 
userInformation.setUserName(rst.getString("user_name")); 
userInformation.setUserLName(rst.getString("user_lName")); 
userInformation.setAddress(rst.getString("address")); 
userInformation.setContactNumber(rst.getLong("contact_number")); 
userInformationList.add(userInformation); 
} 

これは私がこの場合達成する必要があると思います。 これはあなたが多くを助けることを望むので。

関連する問題