【问题标题】:PDO Stored Procedure return valuePDO 存储过程返回值
【发布时间】: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);

【问题讨论】:

标签: php sql-server stored-procedures pdo


【解决方案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# 中它非常简单 - 使用数据集。

              【讨论】:

                猜你喜欢
                • 2012-12-22
                • 2021-10-02
                • 1970-01-01
                • 2012-12-17
                • 2011-10-02
                • 2015-11-06
                • 2021-06-13
                • 2017-07-12
                • 1970-01-01
                相关资源
                最近更新 更多