PDO 存储过程返回值

Posted

技术标签:

【中文标题】PDO 存储过程返回值【英文标题】:PDO Stored Procedure return value 【发布时间】:2010-11-02 08:33:36 【问题描述】:

我正在使用返回错误代码的 SQL Server 存储过程;这是SP的一个非常简单的sn-p。

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

【问题讨论】:

我也有类似的问题,请参阅:***.com/questions/21466503/… 知道了:***.com/a/32224294/2717254 【参考方案1】:

我遇到了类似的问题,并且能够通过像这样返回执行来解决它......

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 的内容以找到您要查找的信息。如果这有帮助,请告诉我!

【讨论】:

【参考方案2】:
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();
    

【讨论】:

【参考方案3】:

刚刚遇到同样的问题:

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

?>

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

Check out MSDN for info on how to correctly bind to this type of call

您的 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参数,而无需重构存储过程。

【讨论】:

另外,正如提到的on another post,您必须指定输出参数的长度,而不是指定输入参数的长度(我一直收到错误“形式参数“@myParam”未声明为OUTPUT 参数,但在请求的输出中传递的实际参数”并省略输入参数长度解决了它...)【参考方案6】:

试试 $return_value

【讨论】:

【参考方案7】:

很确定 PDO::exec 只返回行数。在你的例子中这将是 $rs

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于PDO 存储过程返回值的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP PDO 调用 SQL 存储过程

PHP获取存储过程的返回值

PHP PDO:存储过程返回空结果

PDO 和 MySQL 存储过程。不返回参数

php pdo调用SQLServer存储过程无法获取返回结果

从 MS SQL 中的 PHP PDO 存储过程中返回 Select *