Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico demonstra como usar o driver SQLSRV para chamar um procedimento armazenado no qual um parâmetro foi definido como parâmetro de entrada/saída, e como recuperar os resultados. Ao recuperar um parâmetro de saída ou entrada/saída, todos os resultados devolvidos pelo procedimento armazenado devem ser consumidos antes de o valor do parâmetro devolvido estar acessível.
Observação
Variáveis que são inicializadas ou atualizadas para tipos nulo, DateTime ou stream não podem ser usadas como parâmetros de saída.
Exemplo 1
O exemplo seguinte executa um procedimento armazenado que subtrai as horas de férias já utilizadas das horas de férias disponíveis de um funcionário específico. A variável que representa as horas de férias usadas, $vacationHrs, é passada ao procedimento armazenado como parâmetro de entrada. Após atualizar as horas de férias disponíveis, o procedimento armazenado utiliza o mesmo parâmetro para devolver o número de horas de férias restantes.
Observação
Inicializar $vacationHrs para 4 define o PHPTYPE devolvido para inteiro. Para garantir a integridade do tipo de dados, os parâmetros de entrada/saída devem ser inicializados antes de chamar o procedimento armazenado, ou o tipo PHP desejado deve ser especificado. Para informações sobre a especificação do PHPTYPE, veja Como: Especificar Tipos de Dados PHP.
Como o procedimento armazenado retorna dois resultados, sqlsrv_next_result deve ser chamado após a execução do procedimento armazenado para disponibilizar o valor do parâmetro de saída. Após chamar sqlsrv_next_result, $vacationHrs contém o valor do parâmetro de saída devolvido pelo procedimento armazenado.
Observação
Chamar procedimentos armazenados usando sintaxe canónica é a prática recomendada. Para mais informações sobre sintaxe canónica, veja Chamar um Procedimento Armazenado.
O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.
<?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);
?>
Observação
Ao atribuir um parâmetro de entrada/saída a um tipo bigint, se o valor puder ficar fora do intervalo de um inteiro, terá de especificar o seu tipo de campo SQL como SQLSRV_SQLTYPE_BIGINT. Caso contrário, pode resultar numa exceção de "valor fora do alcance".
Exemplo 2
Este exemplo de código mostra como associar um valor bigint grande como parâmetro de entrada/saída.
<?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);
?>
Ver também
Como: Especificar a Direção dos Parâmetros Usando o Driver SQLSRV