はじめに

SQL Serverにおいて、ストアドプロシージャで大量にデータを処理した後に、何件のレコードが登録、削除、更新されたのかを把握したいケースがあると思います。

この記事では、ストアドプロシージャの実行によって変更されたレコード数をカウントにJavaアプリケーションでログ出力する方法を紹介します。

変更レコード数を表示するには @@ROWCOUNT を利用する

SQL Serverには、 @@ROWCOUNT という直前に実行したSQLで影響を与えたレコード数を返す特殊変数があります。

※ 行数が20億を超える場合は、ROWCOUNT_BIG を使用します。

https://docs.microsoft.com/en-us/sql/t-sql/functions/rowcount-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15

以下に、@@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アプリケーションでログ出力する方法を紹介しました。