35

MySQL データベースを使用しており、Java 経由でアクセスしています。

PreparedStatement prep1 = this.connection.prepareStatement(
        "UPDATE user_table 
        SET Level = 'Super' 
        WHERE Username = ?");
prep1.setString(1, username);

上記の更新ステートメントは正常に機能しますが、このステートメントで影響を受ける行の数を取得したいと思います。これは可能ですか?

4

7 に答える 7

49

Statement.executeUpdate()orexecute()が続くと、JDBC 仕様に従って、一致した行数、更新されていないgetUpdateCount()行数が返されます。更新されたカウントが必要な場合は、非標準の URL オプションとして指定できます。詳細については、こちらをご覧くださいuseAffectedRows=true

于 2014-02-14T17:12:50.147 に答える
47

PreparedStatement でexecuteUpdate()を呼び出すと、更新されたレコードの数である int が返されます。

于 2010-04-03T16:50:43.367 に答える
6
  1. まず、以下のコンストラクターを使用して「PreparedStatement」オブジェクトを準備します。

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. 次に、引数を「pStmt」に設定します。この場合:

    prep1.setString(1, username);
    
  3. 最後に、executeUpdate を実行し、影響を受ける行を整数として取得します

    int affectedRows = pStmt.executeUpdate();
    
于 2016-11-10T09:42:21.503 に答える
2

何かが本当に変更された場合にのみ追加の作業を行いたい別の同様の状況について、これを今見てみると、設定されたフィールドが一致するケースを除外するようにクエリを変更することが最もプラットフォームに依存しない方法だと思います。

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
于 2015-10-07T18:49:15.657 に答える
1

SQL Update の影響を受ける行数は、SQL%ROWCOUNT (ORACLE の場合) または @@ROWCOUNT(SQL SERVER の場合) を使用して返すことができます。

注: 更新、削除などの行数を返すには、更新、削除などの行数を格納するストアド プロシージャで OUT パラメータを使用する必要があります。

  1. 更新、削除などの行数を取得するには、Java で registerOutParameter メソッドを使用する必要があります。

  2. 更新または削除された行数などをストアド プロシージャの OUT パラメータの 1 つに保存するには、コマンドを実行する前に、スクリプトでそのパラメータのタイプを設定する必要があります。(更新または削除の場合はNUMERICになります)

  3. コマンドが実行されたら、そのパラメータのインデックスを呼び出して、更新または削除された行の値を変数に格納します (新しい変数またはクラスなどで使用可能な変数にすることができます) (例: A=cs.getInt(3) ) ストアド プロシージャの OUT パラメータが 2 番目のパラメータの場合)

  4. 現在、変数の値は更新または削除された行 (ieA=10) です。

ストアド ポーセデュアの例

Function demo( A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER;
BEGIN
UPDATE demo_temp SET name=A where name="ABC";
B:=SQL%ROWCOUNT -- total number of rows updated
RETRUN EXIST_LP;
END demo;

Java スクリプトの例

public void update(demo demo){
int rowCount = 0;
Connection conn = null;
CallableStatement cs = null;
try{
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("your data source path");
conn = ds.getConnection();
cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?) ); END;"); // stored proc
cs.registerOutParameter(1, Types.INTEGER);
cs.setString(2, "XYZ");
cs.registerOutParameter(3, Types.NUMERIC);
rowCount=cs.execcuteUpdate();
demo.setUpdateCount(cs.getInt(3));
} catch (SQLException exc) {
  throw new DaoException("An SQL Exception has occurred.", exc);
} catch (NamingException ne) {
  throw new DaoException("A Naming Exception has occurred.", ne);
} catch (Exception e) {
  throw new DaoException("An Exception has occurred", e);
} finally {

  try {
            if (cs != null) {
                cs.close();
            }
} catch (SQLException ex1) {
}
try {
            if (conn != null) {
                conn.close();
            }
} catch (SQLException ex) {
}

}
}

注: executeUpdate() は、更新または削除された行数を返しません。0または1を返すだけです。

  1. 0 -- 実行失敗
  2. 1 -- 実行成功
于 2015-08-14T16:22:39.740 に答える
0

クエリを実行すると、その数が返されます。

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
于 2010-04-03T16:50:40.077 に答える
0

実行せずに影響を受ける行数を知る必要がある場合は、最初に SELECT ステートメントを実行する必要があります。

于 2010-04-03T16:59:20.430 に答える