2009-06-12 6 views
5

Je travaille avec une procédure stockée SQL Server qui renvoie des codes d'erreur; Voici un extrait très simple du SP.La valeur de retour de la procédure stockée PDO

DECLARE @ret int 
BEGIN 
SET @ret = 1 
RETURN @ret 
END 

je peux obtenir la valeur de retour avec l'extension MSSQL en utilisant:

mssql_bind($proc, "RETVAL", &$return, SQLINT2); 

Cependant, je ne peux pas comprendre comment accéder à la valeur de retour en AOP; Je préférerais ne pas utiliser un paramètre OUT, car beaucoup de ces procédures stockées ont déjà été écrites. Voici un exemple de comment j'appelle actuellement la procédure en 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

J'ai un problème similaire, voir: http://stackoverflow.com/questions/21466503/calling-stored-procedure-from-php-using-pdo-to-m ssql-server-using-input-paramter –

+0

A obtenu: http://stackoverflow.com/a/32224294/2717254 –

Répondre

0

ne peut pas utiliser u SELECT pour retourner les résultats? Ensuite, vous pouvez utiliser un ensemble de données (resultset en php?) Pour le ramasser? Je ne connais pas PHP, mais dans C# c'est assez simple - utilisez un ensemble de données.

0

assez sûr PDO :: exec renvoie uniquement le nombre de lignes .. ce serait $ rs dans votre exemple

-1

Essayez return_value $

3

Check out MSDN for info on how to correctly bind to this type of call

Votre code PHP devrait probablement être modifié pour regarder plus comme ça. Cela peut ne fonctionner que si vous appelez via ODBC, ce qui est honnêtement le moyen le plus préféré de faire n'importe quoi avec SQL Server; utiliser le SQL Native Client sur les systèmes Windows, et utilisez le pilote FreeTDS ODBC sur les systèmes * nix:

<?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"; 
?> 

L'essentiel ici est que la valeur de retour peut être lié à un paramètre OUT, sans avoir à restructurer le stocké procédures.

+0

Aussi, comme mentionné [sur un autre article] (https://social.msdn.microsoft.com/Forums/sqlserver/fr-FR/55f21fc5-dbc0-4fe4-a4ae-f15905a4293a/return-valeur-param-de-stock-procedure-is-not-updated-when-a-value-is-return? forum = sqldriverforphp # 6dde4297 -b870-439d-bb03-6313ef544ab9), vous devez spécifier la longueur du paramètre de sortie et ne pas spécifier la longueur du paramètre d'entrée (j'ai gardé l'erreur "Le paramètre formel" @myParam "n'a pas été déclaré comme paramètre OUTPUT, mais le réel paramètre passé dans la sortie demandée "et en omettant la longueur du paramètre d'entrée l'a résolu ...) – Daniel

0

Si je comprends bien votre question, vous ne devriez pas avoir à appeler 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

1

juste eu ce même problème:

<?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; 
} 
?> 
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(); 
    } 
}