Delen via


Procedure: Invoer- en uitvoerparameters ophalen met behulp van het SQLSRV-stuurprogramma

PHP-stuurprogramma downloaden

In dit onderwerp wordt gedemonstreerd hoe u het SQLSRV-stuurprogramma gebruikt om een opgeslagen procedure aan te roepen waarin één parameter is gedefinieerd als een invoer-/uitvoerparameter en hoe u de resultaten ophaalt. Bij het ophalen van een uitvoer- of invoer-/uitvoerparameter moeten alle resultaten die door de opgeslagen procedure worden geretourneerd, worden gebruikt voordat de geretourneerde parameterwaarde toegankelijk is.

Opmerking

Variabelen die zijn geïnitialiseerd of bijgewerkt naar null-, DateTime- of stroomtypen, kunnen niet worden gebruikt als uitvoerparameters.

Voorbeeld 1

In het volgende voorbeeld wordt een opgeslagen procedure aanroept waarmee gebruikte vakantieuren worden afgetrokken van de beschikbare vakantieuren van een opgegeven werknemer. De variabele die de gebruikte vakantieuren vertegenwoordigt, $vacationHrs, wordt als invoerparameter doorgegeven aan de opgeslagen procedure. Na het bijwerken van de beschikbare vakantieuren gebruikt de opgeslagen procedure dezelfde parameter om het aantal resterende vakantieuren te retourneren.

Opmerking

Als u $vacationHrs initialiseert op 4, wordt het geretourneerde PHPTYPE ingesteld op een geheel getal. Om de integriteit van het gegevenstype te waarborgen, moeten invoer-/uitvoerparameters worden geïnitialiseerd voordat de opgeslagen procedure wordt aangeroepen, of moet het gewenste PHPTYPE worden opgegeven. Zie Hoe kunt u PHP-gegevenstypen opgeven voor informatie over het opgeven van het PHPTYPE.

Omdat de opgeslagen procedure twee resultaten retourneert, moet sqlsrv_next_result worden aangeroepen nadat de opgeslagen procedure is uitgevoerd om de waarde van de uitvoerparameter beschikbaar te maken. Nadat sqlsrv_next_result is aangeroepen, bevat $vacationHrs de waarde van de uitvoerparameter die wordt geretourneerd door de opgeslagen procedure.

Opmerking

Het aanroepen van opgeslagen procedures met behulp van canonieke syntaxis is de aanbevolen procedure. Zie Een opgeslagen procedure aanroepen voor meer informatie over canonieke syntaxis.

In het voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd.

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

Opmerking

Wanneer u een invoer-/uitvoerparameter aan een bigint-type bindt, moet u het SQL-veldtype opgeven als SQLSRV_SQLTYPE_BIGINT als de waarde buiten het bereik van een geheel getal terechtkomt. Anders kan dit resulteren in een uitzondering 'waarde buiten bereik'.

Voorbeeld 2

In dit codevoorbeeld ziet u hoe u een grote bigint-waarde koppelt als invoer-/uitvoerparameter.

<?php
$serverName = "(local)";
$connectionInfo = array("Database"=>"testDB");  
$conn = sqlsrv_connect($serverName, $connectionInfo);  
if ($conn === false) {  
    echo "Could not connect.\n";  
    die(print_r(sqlsrv_errors(), true));  
}  

// Assume the stored procedure spTestProcedure exists, which retrieves a bigint value of some large number
// e.g. 9223372036854
$bigintOut = 0;
$outSql = "{CALL spTestProcedure (?)}";
$stmt = sqlsrv_prepare($conn, $outSql, array(array(&$bigintOut, SQLSRV_PARAM_INOUT, null, SQLSRV_SQLTYPE_BIGINT)));
sqlsrv_execute($stmt);
echo "$bigintOut\n";   // Expect 9223372036854

sqlsrv_free_stmt($stmt);  
sqlsrv_close($conn);  

?>

Zie ook

Procedure: Parameterrichting opgeven met behulp van het SQLSRV-stuurprogramma

Procedure: Uitvoerparameters ophalen met behulp van het SQLSRV-stuurprogramma

Gegevens ophalen