はじめに
SQL Serverにおいて、ストアドプロシージャで大量にデータを処理した後に、何件のレコードが登録、削除、更新されたのかを把握したいケースがあると思います。
この記事では、ストアドプロシージャの実行によって変更されたレコード数をカウントにJavaアプリケーションでログ出力する方法を紹介します。
変更レコード数を表示するには @@ROWCOUNT
を利用する
SQL Serverには、 @@ROWCOUNT
という直前に実行したSQLで影響を与えたレコード数を返す特殊変数があります。
※ 行数が20億を超える場合は、ROWCOUNT_BIG
を使用します。
以下に、@@ROWCOUNT
を使って削除レコード数および、登録レコード数を表示するストアドプロシージャの例を記載しました。
ALTER PROCEDURE [TEST].[procedure_count_record]
(
@DELETE_ROW_COUNT INTEGER OUTPUT
,@INSERT_ROW_COUNT INTEGER OUTPUT
)
AS
SET @RESULT_FLAG = 'FALSE'
SET @RESULT_MESSAGE = ''
DELETE FROM TEST.TABLE_001;
SET @DELETE_ROW_COUNT = @@ROWCOUNT;
PRINT @DELETE_ROW_COUNT
INSERT INTO TEST.TABLE_001 VALUES( 1, 'test')
SET @INSERT_ROW_COUNT = @@ROWCOUNT;
PRINT @INSERT_ROW_COUNT
Javaアプリケーションからレコード数を表示
@@ROWCOUNT
を使って、登録レコード数が取得できることが分かりました。
続いて、Javaプログラムからストアドプロシージャを実行し、ログ出力するサンプルプログラムを紹介します。
registerOutParameter
でストアドプロシージャで定義した変数と、Java側の変数を結びつけることができます。
private static String SQL = "{ call TEST.procedure_count_record(?, ?) }";
java.sql.Connection conn = null;
String url = "jdbc:sqlserver://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";
try{
// ストアドプロシージャの準備
conn = DriverManager.getConnection(url, user, password);
java.sql.CallableStatement procedureStatement = conn.prepareCall(SQL);
procedureStatement.registerOutParameter("DELETE_ROW_COUNT", java.sql.Types.INTEGER);
procedureStatement.registerOutParameter("INSERT_ROW_COUNT", java.sql.Types.INTEGER);
// ストアドプロシージャを実行
procedureStatement.executeUpdate();
// レコード数を取得
int countDelete = procedureStatement.getInt("DELETE_ROW_COUNT");
int countInsert = procedureStatement.getInt("INSERT_ROW_COUNT");
System.out.println("Delete Count " + countDelete);
System.out.println("Insert Count " + countInsert);
// クローズ
procedureStatement.close();
} catch (SQLException e){
// 例外処理
} finally{
try{
if (conn != null){
conn.close();
}
}catch (SQLException e){
// 例外処理
}
}
おわりに
この記事では、ストアドプロシージャの実行によって変更されたレコード数をカウントにJavaアプリケーションでログ出力する方法を紹介しました。