如何从存储过程获取返回值?php | pdo

2g32fytz  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(334)

我想显示sql server的sp的返回值。我试着用这种方法,但没有成功。
我使用PHPPDO进行数据库连接,并执行一个sql server存储过程。

$feesObj = new FeesConfig('config/fees.ini');
$feesConfig = $feesObj->getFeesConfig();

$studentId = $user->getSyStudentId();
$statement = $conn->prepare('exec ?= usp_GetStudentDegreeLevel ?');
$statement->bindParam(1, $retval, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$statement->bindParam(2, $studentId, PDO::PARAM_INT);
$statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);

var_dump("return value". $retval);exit;

此sp执行的输出

NULL

预期结果

1

我对这个代码的错误之处。我正在呼叫sql server sp。

zhte4eai

zhte4eai1#

你需要考虑以下几点:
存储的prtocedure的返回值是整数,因此需要使用适当的绑定。
如遇意外 OUTPUT 参数,您需要设置 maxLength 中的参数 PDOStatement::bindParam 呼叫正如文档中所解释的,要…指示参数是存储过程中的out参数,必须显式设置长度。
您需要获取所有可能的结果集(使用 PDOStatement::nextRowset )获取输出参数的值。
我通常使用以下方式执行存储过程(使用sql server的php驱动程序):

try { 
    // 
    $sql = "EXEC ? = usp_GetStudentDegreeLevel ?";
    $statement = $conn->prepare($sql);
    if ($statement === false) {
        echo print_r($conn->errorInfo()), true);
        exit;
    }
    // Execution
    $retval    = 0;
    $studentId = $user->getSyStudentId();
    $statement->bindParam(1, $retval,  PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $statement->bindParam(2, $studentId, PDO::PARAM_INT);
    if ($statement->execute() === false) {
        echo print_r($conn->errorInfo(), true);
        exit;
    }   
    // Fetch data. 
    do {
       if ($statement->columnCount() > 0) {
           while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
              echo print_r($row, true); 
           };
        };  
    } while ($statement->nextRowset());
    // 
    $statement = null;
} catch (PDOException $e) {
    echo $e->getMessage());
    exit;   
}

相关问题