Возвращаемое значение хранимой процедуры PDO - PullRequest
6 голосов
/ 12 июня 2009

Я работаю с хранимой процедурой SQL Server, которая возвращает коды ошибок; Вот очень простой фрагмент SP.

DECLARE @ret int
BEGIN
SET @ret = 1
RETURN @ret
END

Я могу получить возвращаемое значение с расширением mssql, используя:

mssql_bind($proc, "RETVAL", &$return, SQLINT2);

Однако я не могу понять, как получить доступ к возвращаемому значению в PDO; Я бы предпочел не использовать параметр OUT, так как многие из этих хранимых процедур уже написаны. Вот пример того, как я сейчас вызываю процедуру в PHP.

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
$stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

Ответы [ 7 ]

3 голосов
/ 22 августа 2009

Проверьте MSDN для получения информации о том, как правильно связать с этим типом вызова

Ваш PHP-код, вероятно, должен быть настроен так, чтобы выглядеть так. Это может сработать, только если вы звоните через ODBC, что, честно говоря, является наиболее предпочтительным способом сделать что-либо с SQL Server; используйте собственный клиент SQL в системах Windows и драйвер ODBC FreeTDS в системах * nix:

<?php
  $stmt = $this->db->prepare("{?= CALL usp_myproc}");
  $stmt->bindParam(1, $retval, PDO::PARAM_STR, 32);
  $rs = $stmt->execute();
  $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  echo "The return value is $retval\n";
?>

Ключевым моментом здесь является то, что возвращаемое значение может быть связано как параметр OUT, без необходимости реструктурировать хранимые процедуры.

1 голос
/ 07 июня 2012

Просто была такая же проблема:

<?php

function exec_sproc($sproc, $in_params)
{
   global $database;

   $stmnt = $database->prepare("EXEC " . $sproc);
   if($stmnt->execute($in_params))
   {
      if($row = $stmnt->fetch())
      {
         return $row[0];
      }
   }

   return -1;
}
?>
0 голосов
/ 08 марта 2017
public function callProcedure($sp_name = null, $sp_args = []) {
    try {
        for($i = 0; $i < count($sp_args); $i++) {
            $o[] = '?';
        }

        $args = implode(',', $o);
        $sth = $connection->prepare("CALL $sp_name($args)");

        for($i = 0, $z =1; $i < count($sp_args); $i++, $z++) {
            $sth->bindParam($z, $sp_args[$i], \PDO::PARAM_STR|\PDO::PARAM_INPUT_OUTPUT, 2000);
        }

        if($sth->execute()) {
            return $sp_args;
        }
    } catch (PDOException $e) {
        this->error[] = $e->getMessage();
    }
}
0 голосов
/ 27 октября 2009

Если я правильно понимаю ваш вопрос, вам не нужно вызывать fetchAll () ...

$stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
$stmt->bindParam(1, $mystr, PDO::PARAM_STR);
$stmt->bindParam(2, $mystr2, PDO::PARAM_STR);
$rs = $stmt->execute();
echo "The return values are: $mystr , and: $mystr2";

PDOStatement :: bindParam

0 голосов
/ 17 июня 2009

Попробуйте $ return_value

0 голосов
/ 17 июня 2009

уверен, что PDO :: exec возвращает только количество строк .. в вашем примере это будет $ rs

0 голосов
/ 16 июня 2009

вы не можете использовать SELECT для возврата результатов? Тогда вы можете использовать набор данных (набор результатов в php?), Чтобы забрать его? Я не знаю PHP, но в c # все довольно просто - используйте набор данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...