PDO存储过程返回值

6

我正在处理一个返回错误代码的 SQL Server 存储过程; 这里是一个非常简单的存储过程片段。

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);

我遇到了类似的问题,请参考:https://dev59.com/R3vaa4cB1Zd3GeqPJvJg - Michael Fever
明白了:https://dev59.com/ZmYr5IYBdhLWcg3wy9OA#32224294 - Marco Marsala
8个回答

4

请查阅MSDN获取有关如何正确绑定此类调用的信息

您的PHP代码应该进行调整,使其更像以下样例。如果您通过ODBC调用,则可能只能使用此方法,这是与SQL Server一起执行任何操作的强烈建议方法;在Windows系统上使用SQL Native Client,在*nix系统上使用FreeTDS ODBC驱动程序:

<?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参数绑定,而无需重新构建存储过程。

另外,正如在另一篇帖子中提到的那样,您必须指定输出参数的长度,而不是指定输入参数的长度(我一直收到错误消息“形式参数“@myParam”未声明为OUTPUT参数,但传入的实际参数请求输出”,省略输入参数长度解决了这个问题...) - Daniel

1

刚遇到了同样的问题:

<?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

你不能使用SELECT返回结果吗? 然后你可以使用数据集(在PHP中的结果集?)来获取它? 我不懂PHP,但在C#中很简单 - 使用数据集。


0

我相信PDO :: exec只返回行数..这将是您示例中的$rs


0
如果我正确理解了你的问题,你不应该调用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

我有一个类似的问题,通过这样返回执行结果,我成功地解决了它...

function my_function(){
    $stmt = $this->db->prepare("EXECUTE usp_myproc ?, ?");
    $stmt->bindParam(1, 'mystr', PDO::PARAM_STR);
    $stmt->bindParam(2, 'mystr2', PDO::PARAM_STR);
    return $stmt->execute();
}

只需要使用一个变量调用函数,然后分析该变量即可。
$result = my_function();

现在您可以分析 $result 的内容以找到您要查找的信息。如果有帮助,请告诉我!


0
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();
    }
}

-1

尝试 $return_value


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接