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 存储过程返回值的主要内容,如果未能解决你的问题,请参考以下文章