Cara: Mengambil Parameter Masukan dan Keluaran Menggunakan Driver SQLSRV
Topik ini menunjukkan cara menggunakan driver SQLSRV untuk memanggil prosedur tersimpan di mana satu parameter telah didefinisikan sebagai parameter input/output, dan cara mengambil hasilnya. Saat mengambil parameter output atau input/output, semua hasil yang dikembalikan oleh prosedur tersimpan harus digunakan sebelum nilai parameter yang dikembalikan dapat diakses.
Catatan
Variabel yang diinisialisasi atau diperbarui ke jenis null, DateTime, atau stream tidak dapat digunakan sebagai parameter output.
Contoh 1
Contoh berikut memanggil prosedur tersimpan yang mengurangi jam liburan yang digunakan dari jam liburan yang tersedia dari karyawan tertentu. Variabel yang mewakili jam liburan yang digunakan, $vacationHrs, diteruskan ke prosedur tersimpan sebagai parameter input. Setelah memperbarui jam liburan yang tersedia, prosedur tersimpan menggunakan parameter yang sama untuk mengembalikan jumlah jam liburan yang tersisa.
Catatan
Menginisialisasi $vacationHrs ke 4 mengatur PHPTYPE yang dikembalikan ke bilangan bulat. Untuk memastikan integritas jenis data, parameter input/output harus diinisialisasi sebelum memanggil prosedur tersimpan, atau PHPTYPE yang diinginkan harus ditentukan. Untuk informasi tentang menentukan PHPTYPE, lihat Cara: Menentukan Jenis Data PHP.
Karena prosedur tersimpan mengembalikan dua hasil, sqlsrv_next_result harus dipanggil setelah prosedur tersimpan dijalankan untuk membuat nilai parameter output tersedia. Setelah memanggil sqlsrv_next_result, $vacationHrs berisi nilai parameter output yang dikembalikan oleh prosedur tersimpan.
Catatan
Memanggil prosedur tersimpan menggunakan sintaksis kanonis adalah praktik yang direkomendasikan. Untuk informasi selengkapnya tentang sintaksis kanonis, lihat Memanggil Prosedur Tersimpan.
Contoh mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah.
<?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);
?>
Catatan
Saat mengikat parameter input/output ke jenis bigint, jika nilai mungkin berakhir di luar rentang bilangan bulat, Anda harus menentukan jenis bidang SQL-nya sebagai SQLSRV_SQLTYPE_BIGINT. Jika tidak, ini dapat mengakibatkan pengecualian "nilai di luar rentang".
Contoh 2
Sampel kode ini menunjukkan cara mengikat nilai bigint besar sebagai parameter input/output.
<?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);
?>
Lihat Juga
Cara: Menentukan Arah Parameter Menggunakan Driver SQLSRV