Я пытаюсь выяснить, как выполнить хранимую процедуру с помощью php5.3 / pdo_sqlsrv на SQL Server 2008.
Я нашел этот код:
$sql = new PDO( "sqlsrv:server=$server;Database = $database", $user, $password); $query = "{? = CALL sp_Login(?, ?)}"; $stmt = $sql->prepare( $query ); $returnVariable = 0; $inputVariable1 = 'input1'; $inputVariable2 = 'input2'; $stmt->bindParam(1,$returnVariable,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,100); $stmt->bindParam(2,$inputVariable1,PDO::PARAM_STR); $stmt->bindParam(3,$inputVariable2,PDO::PARAM_STR); $stmt->execute(); echo "Return value: ".$returnVariable;
хранимая процедура имеет два входа и один выходной параметр, но кажется, что он ничего не возвращает, возвращаемое значение все равно 0 ..
Я могу запускать запросы выбора / вставки, поэтому это не соединение.
Есть ли хорошая документация о хранимых процедурах с pdo_sqlsrv?
благодаря!
после дня поиска я нашел способ вызова sp … проблема заключалась в том, что в хранимой процедуре был запущен запрос на вставку, и мне пришлось вызвать nextRowset (), чтобы получить возвращаемое значение
$sql = new PDO( "sqlsrv:server=$server;Database = $database", $user, $password); $input1 = "input1"; $input2 = "input2"; $return_value = -1; $proc = '{? = CALL sp_Name (?, ?) }'; $stmt = $sql->prepare( $proc ); $stmt->bindParam(1,$return_value ,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,4); $stmt->bindParam(2,$input1,PDO::PARAM_STR); $stmt->bindParam(3,$input2,PDO::PARAM_STR); $stmt->nextRowset(); //skip INSERT result $result = $stmt->fetch(PDO::FETCH_ASSOC); /* Display the value of the output parameter */ echo "Return value: ".$return_value.'<br>';
Возможно, эта форма поможет
// Example #4 Calling a stored procedure with an output parameter $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); $stmt->execute(); print "procedure returned $return_value\n"; // Example #5 Calling a stored procedure with an input/output parameter $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); $stmt->execute(); print "procedure returned $value\n";
В вашем сохраненном proc необходимо было включить инструкцию «SET NOCOUNT ON», так что инструкция Insert внутри не требовала вызова метода nextRowset ().