2016-10-26 5 views
2

を提出することはできません私はJDBCを使用してデータベースを照会しようとすると、以下のコマンドをJDBCエラー:java.sql.SQLExceptionを:ます。java.sql.SQLException:提出できない空の問い合わせ

CallableStatement call_state =null; 
call_state =con.prepareCall("UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?"); 
call_state.setInt(1, d_next_o_id); 
call_state.setInt(2, d_id); 
call_state.setInt(3, d_w_id);   
rs=call_state.executeQuery();` 

を使用しています私は、例外が発生しました空のクエリ。

+1

'CallableStatement'の代わりに' PreparedStatement'を使用してみてください。 –

+2

'PreparedStatement'と' PreparedStatement.executeUpdate() 'を使います。 'update'ステートメントは' ResultSet'を返しません。 –

+1

'CallableStatement'は、プロシージャと関数の呼び出しに使用され、クエリの実行には使用されません。前のコメントのアドバイスに従い、 'PreparedStatement'を使います。 – Tom

答えて

3

CallableStatement(CS)が「SQLストアドプロシージャの実行に使用されるインターフェイス」であるにもかかわらず、PreparedStatementのサブインターフェイスです。このため、Liskov Substitution Principleに準拠するCS実装では、通常のUPDATE,SELECTまたはDELETEの操作(いずれも平文の場合はPreparedStatement)を実行できる必要があります。

コードの実際の問題は、提供したスニペットの最後の行にあります。 UPDATEステートメントでexecuteQuery()を使用していますが、これは機能しません。代わりに、execute()またはexecuteUpdate()のいずれかを使用する必要があります。その行を変更すると、

call_state.executeUpdate(); 

になるはずです。

これを「正しく」実行したい場合は、慣用で、CallableStatementの代わりにPreparedStatementを使用する必要があります。ストアードプロシージャを呼び出さないからです。さらに、try-with-resources statementを使用してリソースをクローズする必要があります。

try (PreparedStatement ps = con.prepareStatement(
     "UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?")) { 
    ps.setInt(1, d_next_o_id); 
    ps.setInt(2, d_id); 
    ps.setInt(3, d_w_id);   
    ps.executeUpdate(); 
} catch (SQLException e) { 
    // handle it 
} 
関連する問題