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 chamar um procedimento armazenado em que um parâmetro foi definido como parâmetro de saída. 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.
O truncamento de dados pode ocorrer quando tipos de fluxo como SQLSRV_SQLTYPE_VARCHAR('max') são usados como parâmetros de saída. Os tipos de fluxo não são suportados como parâmetros de saída. Para tipos não de fluxo, pode ocorrer truncamento de dados se o comprimento do parâmetro de saída não for especificado ou se o comprimento especificado não for suficientemente grande para o parâmetro de saída.
Exemplo 1
O exemplo seguinte chama um procedimento armazenado que devolve as vendas acumuladas no ano por um determinado colaborador. A variável PHP $lastName é um parâmetro de entrada e $salesYTD é um parâmetro de saída.
Observação
Inicializar $salesYTD em 0.0 faz com que o PHPTYPE devolvido fique flutuante. Para garantir a integridade do tipo de dados, os parâmetros de saída devem ser inicializados antes de chamar o procedimento armazenado, ou deve ser especificado o tipo PHP desejado. Para informações sobre a especificação do PHPTYPE, veja Como: Especificar Tipos de Dados PHP.
Como apenas um resultado é devolvido pelo procedimento armazenado, $salesYTD contém o valor devolvido do parâmetro de saída imediatamente após a execução do 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('GetEmployeeSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE GetEmployeeSalesYTD";
$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 GetEmployeeSalesYTD
@SalesPerson nvarchar(50),
@SalesYTD money OUTPUT
AS
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e
ON e.EmployeeID = sp.SalesPersonID
WHERE LastName = @SalesPerson";
$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 GetEmployeeSalesYTD( ?, ? )}";
/* Define the parameter array. By default, the first parameter is an
INPUT parameter. The second parameter is specified as an OUTPUT
parameter. Initializing $salesYTD to 0.0 sets the returned PHPTYPE to
float. 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.*/
$lastName = "Blythe";
$salesYTD = 0.0;
$params = array(
array($lastName, SQLSRV_PARAM_IN),
array(&$salesYTD, SQLSRV_PARAM_OUT)
);
/* 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 $salesYTD. */
echo "YTD sales for ".$lastName." are ". $salesYTD. ".";
/*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 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 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_OUT, 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
Como: Recuperar Parâmetros de Entrada e Saída Usando o Driver SQLSRV