次の方法で共有


入出力パラメーターを取得する方法

このトピックでは、入出力パラメータとして定義されているパラメータを持つストアド プロシージャを呼び出す方法とその結果を取得する方法について説明します。出力パラメータまたは入出力パラメータを取得する際には、ストアド プロシージャによって返された結果がすべて使用されてからでないと、パラメータの戻り値にアクセスできません。

注意

nullDateTime、またはストリームのいずれかの型に初期化または更新される変数を出力パラメータとして使用することはできません。

指定した従業員の利用可能な休暇時間数から利用済みの休暇時間数を差し引くストアド プロシージャを呼び出す例を次に示します。利用済みの休暇時間数を表す変数である $vacationHrs は、入力パラメータとしてストアド プロシージャに渡されます。ストアド プロシージャは、利用可能な従業員の休暇時間数を更新した後、同じパラメータを使用して残りの休暇時間数を返します。

注意

$vacationHrs を 4 に初期化すると、返される PHPTYPE が整数に設定されます。データ型の整合性を確保するためには、ストアド プロシージャを呼び出す前に入出力パラメータを初期化するか、目的の PHPTYPE を指定する必要があります。PHPTYPE の指定の詳細については、「PHP データ型を指定する方法」を参照してください。

このストアド プロシージャは 2 つの結果を返すため、出力パラメータの値を使用できるようにするには、ストアド プロシージャの実行が完了した後に sqlsrv_next_result を呼び出す必要があります。sqlsrv_next_result を呼び出すと、ストアド プロシージャから返された出力パラメータの値が $vacationHrs に格納されます。

注意

正規構文を使用してストアド プロシージャを呼び出すことをお勧めします。正規構文の詳細については、「ストアド プロシージャの呼び出し」を参照してください。

この例では、SQL Server と AdventureWorks データベースがローカル コンピュータにインストールされていることを前提としています。この例をコマンド ラインから実行した場合、すべての出力はコンソールに書き込まれます。

<?php
/* Connect to the local server using Windows Authentication and 
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Drop the stored procedure if it already exists. */
$tsql_dropSP = "IF OBJECT_ID('SubtractVacationHours', 'P') IS NOT NULL
                DROP PROCEDURE SubtractVacationHours";
$stmt1 = sqlsrv_query( $conn, $tsql_dropSP);
if( $stmt1 === false )
{
     echo "Error in executing statement 1.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Create the stored procedure. */
$tsql_createSP = "CREATE PROCEDURE SubtractVacationHours
                        @EmployeeID int,
                        @VacationHrs smallint OUTPUT
                  AS
                  UPDATE HumanResources.Employee
                  SET VacationHours = VacationHours - @VacationHrs
                  WHERE EmployeeID = @EmployeeID;
                  SET @VacationHrs = (SELECT VacationHours
                                      FROM HumanResources.Employee
                                      WHERE EmployeeID = @EmployeeID)";

$stmt2 = sqlsrv_query( $conn, $tsql_createSP);
if( $stmt2 === false )
{
     echo "Error in executing statement 2.\n";
     die( print_r( sqlsrv_errors(), true));
}

/*--------- The next few steps call the stored procedure. ---------*/

/* Define the Transact-SQL query. Use question marks (?) in place of
the parameters to be passed to the stored procedure */
$tsql_callSP = "{call SubtractVacationHours( ?, ?)}";

/* Define the parameter array. By default, the first parameter is an
INPUT parameter. The second parameter is specified as an INOUT
parameter. Initializing $vacationHrs to 8 sets the returned PHPTYPE to
integer. To ensure data type integrity, output parameters should be
initialized before calling the stored procedure, or the desired
PHPTYPE should be specified in the $params array.*/

$employeeId = 4;
$vacationHrs = 8;
$params = array( 
                 array($employeeId, SQLSRV_PARAM_IN),
                 array($vacationHrs, SQLSRV_PARAM_INOUT)
               );

/* Execute the query. */
$stmt3 = sqlsrv_query( $conn, $tsql_callSP, $params);
if( $stmt3 === false )
{
     echo "Error in executing statement 3.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Display the value of the output parameter $vacationHrs. */
sqlsrv_next_result($stmt3);
echo "Remaining vacation hours: ".$vacationHrs;

/*Free the statement and connection resources. */
sqlsrv_free_stmt( $stmt1);
sqlsrv_free_stmt( $stmt2);
sqlsrv_free_stmt( $stmt3);
sqlsrv_close( $conn);
?>

参照

処理手順

パラメーターの方向を指定する方法
出力パラメーターを取得する方法

その他のリソース

データの取得