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

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

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

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

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

Note

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

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

Note

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

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

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

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 の状態値が返されます。

次の例では、サンプル データベースへの開いている接続が 関数に渡され、 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();
    }
}

こちらもご覧ください

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