状態の戻り値があるストアド プロシージャの使用

JDBC ドライバーのダウンロード

呼び出すことができる SQL Server ストアド プロシージャは、状態パラメーターまたは結果パラメーターを返すプロシージャです。 この状態は一般的に、ストアド プロシージャの成功または失敗を示すために使用されます。 Microsoft JDBC Driver for SQL Server が提供する SQLServerCallableStatement クラスを使用することで、この種類のストアド プロシージャを呼び出し、返されるデータを処理することができます。

JDBC ドライバーを使用してこの種類のストアド プロシージャを呼び出す場合は、call SQL エスケープ シーケンスを、SQLServerConnection クラスの prepareCall メソッドと組み合わせて使用する必要があります。 状態の戻り値パラメーターを持つ call エスケープ シーケンスの構文は次のとおりです。

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

注意

SQL エスケープ シーケンスの詳細については、「SQL エスケープ シーケンスの使用」を参照してください。

call エスケープ シーケンスを作成するとき、状態の戻り値パラメーターは ? (疑問符) 文字を利用して指定します。 この文字は、ストアド プロシージャから返されるパラメーター値のプレースホルダーになります。 状態の戻り値パラメーターの値を指定するには、ストアド プロシージャを実行する前に、SQLServerCallableStatement クラスの registerOutParameter メソッドを使用して、各パラメーターのデータ型を指定する必要があります。

Note

SQL Server のデータベースと合わせて JDBC ドライバーを使用する場合、registerOutParameter メソッドで状態の戻り値パラメーターに対して指定した値は、常に整数になります。この値は、java.sql.Types.INTEGER データ型を使用して指定できます。

さらに、registerOutParameter メソッドに状態の戻り値パラメーターの値を渡す場合は、パラメーターに使用するデータ型だけでなく、ストアド プロシージャの呼び出しにおいてパラメーターの順序も指定する必要があります。 状態の戻り値パラメーターは、ストアド プロシージャの呼び出しにおいて常に最初のパラメーターであるため、位置を示す序数は常に 1 になります。 SQLServerCallableStatement クラスでは、パラメーター名を使用したパラメーター指定がサポートされていますが、状態の戻り値パラメーターに使用できるのは、パラメーターの序数位置番号だけです。

例として、AdventureWorks2022 サンプル データベースで次のストアド プロシージャを作成します。

CREATE PROCEDURE CheckContactCity  
   (@cityName CHAR(50))  
AS  
BEGIN  
   IF ((SELECT COUNT(*)  
   FROM Person.Address  
   WHERE City = @cityName) > 1)  
   RETURN 1  
ELSE  
   RETURN 0  
END  

このストアド プロシージャでは、cityName パラメーターで指定された都市名が Person.Address テーブルに存在するかどうかによって、1 または 0 の状態値が返されます。

次の例の関数は、AdventureWorks2022 サンプル データベースに対して開かれた接続を渡され、execute メソッドを使って CheckContactCity ストアド プロシージャを呼び出します。

public static void executeStoredProcedure(Connection con) {
    try(CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");) {
        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
        cstmt.setString(2, "Atlanta");
        cstmt.execute();
        System.out.println("RETURN STATUS: " + cstmt.getInt(1));
    }
    // Handle any errors that may have occurred.
    catch (SQLException e) {
        e.printStackTrace();
    }
}

関連項目

ストアド プロシージャでのステートメントの使用