2009-06-12 26 views
5

Sto lavorando con una stored procedure SQL Server che restituisce i codici di errore; ecco un frammento molto semplice della SP.Valore restituito procedura memorizzata PDO

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

posso ottenere il valore di ritorno con l'estensione mssql utilizzando:

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

Tuttavia, non riesco a capire come accedere al valore di ritorno a DOP; Preferirei non utilizzare un parametro OUT, dato che molte di queste stored procedure sono già state scritte. Ecco un esempio di come sto attualmente chiamando la procedura in 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

Sto riscontrando un problema simile, vedi: http://stackoverflow.com/questions/21466503/calling-stored-procedure-from-php-using-pdo-to-m ssql-server-using-input-paramter –

+0

Ottenuto: http://stackoverflow.com/a/32224294/2717254 –

risposta

0

non può u usare SELEZIONARE per restituire i risultati? Quindi puoi utilizzare un set di dati (set di risultati in php?) Per prelevarlo? Non conosco il PHP, ma in C# è abbastanza semplice: usa un set di dati.

0

abbastanza sicuro DOP :: Exec restituisce solo il numero di righe .. questo sarebbe $ rs nel tuo esempio

-1

Prova $ RETURN_VALUE

3

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

vostro codice PHP dovrebbe probabilmente essere ottimizzato per guardare più come questo. Questo può funzionare solo se stai chiamando attraverso ODBC, che è onestamente il modo fortemente preferito per fare qualsiasi cosa con SQL Server; utilizzare il Native Client SQL su sistemi Windows, e utilizzare il driver FreeTDS ODBC su sistemi * 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"; 
?> 

La cosa fondamentale è che il valore di ritorno può essere legato come un parametro OUT, senza dover ristrutturare il memorizzata procedure.

+0

Inoltre, come menzionato [su un altro post] (https://social.msdn.microsoft.com/Forums/sqlserver/it-IT/55f21fc5-dbc0-4fe4-a4ae-f15905a4293a/return-valore-param-da-immagazzinata-procedure-is-not-aggiornato-quando-a-valore-è-ritornato? forum = sqldriverforphp # 6dde4297 -b870-439d-bb03-6313ef544ab9), è necessario specificare la lunghezza del parametro di uscita e non specificare la lunghezza del parametro di input (ho continuato a ricevere l'errore "Il parametro formale" @myParam "non è stato dichiarato come parametro OUTPUT, ma l'effettivo parametro passato nell'output richiesto "e omettendo la lunghezza del parametro di input risolto ...) – Daniel

0

Se ho capito la tua domanda correttamente non si dovrebbero avere a chiamare 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

Proprio avuto questo stesso problema:

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