Как мне прочитать выходной параметр, тип которого - uniqueidentifier? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь выполнить хранимую процедуру на SQL Server, используя PDO.Все работает нормально, но когда я пытаюсь прочитать выходной параметр (тип UNIQUEIDENTIFIER), единственное, что я получаю, это NULL.

Я попытался запустить свой скрипт на Debian 9 с PHP 7.0 и Ubuntu 18.10с PHP 7.2 и изменением типа PDO моего параметра, но безуспешно.

$order_uid = null;
$sql = "EXEC spInsertOrder ?, ?, ?, ?...";
$stmt = $db->prepare($sql);

$stmt->bindParam(29, $order_uid, PDO::PARAM_INPUT_OUTPUT | PDO::PARAM_STR, 50);
if ($stmt->execute() === false) {
    echo $stmt->errorCode();
    print_r($stmt->errorInfo());
}

Я ожидаю получить UUID, который излучает SQL Server, вместо этого возникает ошибка:

Неустранимая ошибка: Uncaught PDOException: SQLSTATE [IMSSP]: указан неверный тип для параметра 5.В качестве параметров могут использоваться только логические значения, целые числа, числа с плавающей точкой, строки и потоки.

1 Ответ

0 голосов
/ 15 февраля 2019

Прежде чем прочитать значение вашего параметра OUTPUT, вам необходимо учесть следующее:

  • Если ваша хранимая процедура выполняет операторы SELECT, вам нужно использовать все результаты с PDOStatement::nextRowset, прежде чем получить доступ к значению вашего выходного параметра.
  • Если ваш оператор выполняет операторы INSERT или UPDATE, поместите SET NOCOUNT ON в качестве первой строки в вашей процедуре, чтобы SQL Server не возвращал количество затронутых строк в качестве набора результатов.
  • установите ваш PHPпеременная null.

Рабочий пример (протестировано с PHP 7.1.12 и драйвером PHP для SQL Server (PDO) 4.3.0 + 9904):

T-SQL:

CREATE PROCEDURE [dbo].[sp_UID]
    @id UNIQUEIDENTIFIER OUTPUT
AS BEGIN
    SET NOCOUNT ON
    SET @id = NEWID()
END

PHP:

<?php
# Connection info
$server   = 'server\instance,port';
$database = 'database';
$uid      = 'uid';
$pwd      = 'pdw';

# Connection
try {
    $dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die("Error connecting to SQL Server. ".$e->getMessage());
}

# Stored procedure
try {
    $sql = "{CALL sp_UID(?)}";
    $uid = null;

    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $uid, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 36);
    $stmt->execute();
    // If your procedure returns result set, you need to fetch result and then get the value for your output parameter
    /*
    do {
        while ($row = $stmt->fetch( PDO::FETCH_ASSOC )) {
        }
    } while ($stmt->nextRowset());  
    */
} catch( PDOException $e ) {
    die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;

# End
$dbh = null;
echo $uid;
?>

Вывод:

F689A035-C3DB-4D4E-88FB-52F5DA133FA8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...