Share via


Procédure : récupérer des paramètres d'entrée/de sortie

Cette rubrique montre comment appeler une procédure stockée dans laquelle un seul paramètre a été défini en tant que paramètre d'entrée/de sortie, et comment récupérer les résultats. Notez que lors de la récupération d'un paramètre de sortie ou d'entrée/de sortie, tous les résultats retournés par la procédure stockée doivent être traités avant que la valeur de paramètre retournée ne soit accessible.

Cc644932.note(fr-fr,SQL.90).gifRemarque :
Les variables qui ont pour valeur initiale ou mise à jour null, DateTime ou des types de flux de données ne peuvent pas être utilisées en tant que paramètres de sortie.

Exemple

L'exemple suivant appelle une procédure stockée qui déduit les heures d'absence utilisées du nombre total d'heures d'absence disponibles pour un employé spécifique. La variable $vacationHrs, qui représente les heures d'absence utilisées, est passée à la procédure stockée sous forme de paramètre d'entrée. Après avoir mis à jour les heures d'absence disponibles, la procédure stockée utilise le même paramètre pour retourner le nombre d'heures d'absence restantes.

Cc644932.note(fr-fr,SQL.90).gifRemarque :
L'initialisation de $vacationHrs à 4 définit le PHPTYPE retourné à un nombre entier (integer). Pour garantir l'intégrité du type de données, les paramètres d'entrée/de sortie doivent être initialisés avant l'appel de la procédure stockée ; à défaut, le PHPTYPE souhaité doit être spécifié. Pour plus d'informations sur la spécification de PHPTYPE, consultez Procédure : spécifier les types de données PHP.

Dans la mesure où la procédure stockée retourne deux résultats, sqlsrv_next_result doit être appelé après l'exécution de la procédure stockée afin de rendre disponible la valeur du paramètre de sortie. Après l'appel de sqlsrv_next_result, $vacationHrs contient la valeur du paramètre de sortie qui a été retourné par la procédure stockée.

Cc644932.note(fr-fr,SQL.90).gifRemarque :
L'appel des procédures stockées à l'aide de la syntaxe canonique est la pratique recommandée. Pour plus d'informations sur la syntaxe canonique, consultez Appel d'une procédure stockée.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console lorsque l'exemple est exécuté à partir de la ligne de commande.

<?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);
?>

Voir aussi

Tâches

Procédure : spécifier la direction du paramètre
Procédure : récupérer des paramètres de sortie

Autres ressources

Récupération des données