MySQLデータベースを使用し、Javaを介してアクセスしています。
PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table
SET Level = 'Super'
WHERE Username = ?");
prep1.setString(1, username);
上記の更新ステートメントは正常に機能しますが、このステートメントで影響を受ける行の数を取得したいと思います。これは可能ですか?
PreparedStatementで executeUpdate() を呼び出すと、更新されたレコードの数であるintが返されます。
Statement.executeUpdate()
またはexecute()
に続いてgetUpdateCount()
は、行数matchedを返します。 JDBC仕様に従って、updatedではありません。更新されたカウントが必要な場合は、useAffectedRows=true
を 非標準URLオプション として指定できます。詳細情報が利用可能です こちら 。
まず、以下のコンストラクターを使用して 'PreparedStatement'オブジェクトを準備します。
PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
//here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?")
次に、引数を「pStmt」に設定します。この場合:
prep1.setString(1, username);
最後に、executeUpdateを実行し、影響を受ける行を整数として取得します
int affectedRows = pStmt.executeUpdate();
何かが実際に変更された場合にのみ追加の作業を行いたいという別の同様の状況で今これを見ると、最もプラットフォームに依存しない方法は、設定フィールドが一致するケースを除外するようにクエリを変更することだと思います:
UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
クエリを実行すると、その番号が返されます。
int rows = prep1.executeUpdate();
System.out.printf("%d row(s) updated!", rows);
実行せずに影響を受ける行数を知る必要がある場合は、最初にSELECTステートメントを実行する必要があります。
SQL Updateの影響を受ける行の数は、SQL%ROWCOUNT(Oracleの場合)または@@ ROWCOUNT(FOR SQL SERVER)を使用して返すことができます
注:更新、削除などの行数を返すには、更新、削除などの行数を格納するストアドプロシージャでOUTパラメーターを使用する必要があります。
更新、削除などの行数を取得するには、JavaのregisterOutParameterメソッドを使用する必要があります。
更新または削除された行数などをストアドプロシージャのOUTパラメータの1つに格納するには、コマンドを実行する前にスクリプトでそのパラメータのタイプを設定する必要があります。 (更新または削除の場合、NUMERICになります)
コマンドが実行されたら、更新された行または削除された行の値を変数に保存します(新しい変数またはクラスで利用可能な変数など)。そのパラメーターのインデックスを呼び出します(例:A = cs.getInt(3) )ストアドプロシージャのOUTパラメーターが2番目のパラメーターである場合)
これで、変数の値は更新または削除された行の値になります(つまり、A = 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 scriptの例
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を返すだけです。