我正在使用返回错误代码的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);
答案 0 :(得分:3)
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参数,而不必重新构建存储过程。
答案 1 :(得分: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;
}
?>
答案 2 :(得分:0)
你不能用 SELECT 来返回结果吗? 然后你可以使用数据集(php中的结果集?)来获取它? 我不知道PHP,但在c#中它非常简单 - 使用数据集。
答案 3 :(得分:0)
非常确定PDO :: exec只返回行数..在你的例子中,这将是$ rs
答案 4 :(得分: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";
答案 5 :(得分: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();
}
}
答案 6 :(得分: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的内容以查找所需的信息。请告诉我是否有帮助!
答案 7 :(得分:-1)
尝试$ return_value