SQL Update の影響を受ける行数は、SQL%ROWCOUNT (ORACLE の場合) または @@ROWCOUNT(SQL SERVER の場合) を使用して返すことができます。
注: 更新、削除などの行数を返すには、更新、削除などの行数を格納するストアド プロシージャで OUT パラメータを使用する必要があります。
更新、削除などの行数を取得するには、Java で registerOutParameter メソッドを使用する必要があります。
更新または削除された行数などをストアド プロシージャの OUT パラメータの 1 つに保存するには、コマンドを実行する前に、スクリプトでそのパラメータのタイプを設定する必要があります。(更新または削除の場合はNUMERICになります)
コマンドが実行されたら、そのパラメータのインデックスを呼び出して、更新または削除された行の値を変数に格納します (新しい変数またはクラスなどで使用可能な変数にすることができます) (例: A=cs.getInt(3) ) ストアド プロシージャの OUT パラメータが 2 番目のパラメータの場合)
現在、変数の値は更新または削除された行 (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を返すだけです。
- 0 -- 実行失敗
- 1 -- 実行成功