更新数があるストアド プロシージャの使用
ストアド プロシージャを使用して SQL Server データベース内のデータを変更するために、Microsoft JDBC Driver for SQL Server には SQLServerCallableStatement クラスが用意されています。 SQLServerCallableStatement クラスを使用すると、データベース内のデータに変更を加え、影響を受けた行数 (更新数) を返すストアド プロシージャを呼び出すことができます。
SQLServerCallableStatement クラスを使用してストアド プロシージャに対する呼び出しを設定すると、execute メソッドまたは executeUpdate メソッドのいずれかを使用して、ストアド プロシージャを呼び出すことができます。 executeUpdate メソッドではストアド プロシージャの影響を受けた行数を示す int 値が返されますが、execute メソッドではこの値が返されません。 execute メソッドを使用して影響を受けた行数を取得する場合は、ストアド プロシージャの実行後に getUpdateCount メソッドを呼び出すことができます。
注意
JDBC ドライバで、発生した可能性があるすべてのトリガが返した更新数を含む、すべての更新数を返す場合、lastUpdateCount 接続文字列プロパティを "false" に設定します。 lastUpdateCount プロパティの詳細については、「接続プロパティの設定」を参照してください。
例として、次に示すテーブルとストアド プロシージャを作成し、AdventureWorks2022 サンプル データベースへのサンプル データの挿入も行います。
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
CREATE PROCEDURE UpdateTestTable
@Col2 varchar(50),
@Col3 int
AS
BEGIN
UPDATE TestTable
SET Col2 = @Col2, Col3 = @Col3
END;
INSERT INTO dbo.TestTable (Col2, Col3) VALUES ('b', 10);
次の例の関数は、AdventureWorks2022 サンプル データベースに対して開かれた接続を渡され、execute メソッドを使って UpdateTestTable ストアド プロシージャを呼び出してから、getUpdateCount メソッドを使って、ストアド プロシージャによって影響を受けた行数を取得します。
public static void executeUpdateStoredProcedure(Connection con) {
try(CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");) {
cstmt.setString(1, "A");
cstmt.setInt(2, 100);
cstmt.execute();
int count = cstmt.getUpdateCount();
System.out.println("ROWS AFFECTED: " + count);
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}