1

JDBC executeUpdate() メソッドに問題があります。行を更新するかどうかにかかわらず、常に 1 を返します。メソッドを理解している限り、行が変更されていない場合は 0 を返す必要があります。

これが私のコードのサンプルです:

try {
conn = pool.getConnection();
        PreparedStatement ps = conn.prepareStatement("{CALL UPDATE_USER (?,?,?)}");
        ps.setString(1, field.toString());
        ps.setString(2, change);
        ps.setString(3, userID);
        int updated = ps.executeUpdate();
        System.out.println(updated);
        if(updated==0){
            throw new NoUserException();
        }
        ps.close();
    } catch (SQLException e) {
        log.error("An error occurred while creating the connection");
        e.printStackTrace();
    } finally {
        pool.returnConnection(conn);
    }

これは、プリペアド ステートメントまたはストアド プロシージャを使用していることが原因でしょうか?

ストアド プロシージャは次のとおりです。

create or replace
PROCEDURE UPDATE_USER
(
  updateColumn IN user_tab_columns.column_name%type,
  changeStr IN VARCHAR2,
  unID IN VARCHAR2
)
IS
BEGIN
  EXECUTE IMMEDIATE
    'UPDATE
      users
SET ' || updateColumn || '= :1
WHERE
  uniqueID = :2'
  USING changeStr, unID; 
END;
4

2 に答える 2

2

ストアド プロシージャの実行から情報を取得できません。行数 (またはその他) を取得する場合は、PROCEDURE を FUNCTION に切り替え、この関数に return 句を追加し、呼び出しを次のように変更します。= CALL ... 関数内で sql%rowcount を使用してテストし、影響を受ける行数を取得します。

于 2012-12-20T13:10:57.197 に答える
0

プロシージャまたは関数でCallable ステートメントを使用できます。戻りパラメータとして影響を受けた行の数を返します

于 2012-12-20T13:23:54.290 に答える