2009-06-12 13 views
5

Pracuję z procedurą składowaną programu SQL Server, która zwraca kody błędów; tutaj jest bardzo prosty fragment SP.Procedura zapisana w ChNP zwróciła wartość

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

mogę uzyskać wartości zwracanej z rozszerzeniem mssql używając:

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

Jednak nie mogę dowiedzieć się, jak uzyskać dostęp do wartości zwracanej w PDO; Wolałbym nie używać parametru OUT, ponieważ wiele z tych procedur przechowywanych zostało już zapisanych. Oto przykład tego, jak nazywam procedurę w 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

Mam podobny problem, zobacz: http://stackoverflow.com/questions/21466503/calling-stored-procedure-from-php-using-pdo-to-m ssql-server-using-input-paramter –

+0

Got it: http://stackoverflow.com/a/32224294/2717254 –

Odpowiedz

0

nie można korzystać SELECT wrócić wyniki? Następnie można użyć zestawu danych (zestaw wyników w php?), Aby go odebrać? Nie wiem, wiem PHP, ale w języku C# jest dość proste - użyj zestawu danych.

0

całkiem pewny PDO :: exec zwraca tylko liczbę wierszy .. to byłoby $ rs twojej przykład

-1

Spróbuj $ Return_Value

3

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

Twój kod PHP należy prawdopodobnie szukać manipulowane bardziej jak to. Może to działać tylko wtedy, gdy korzystasz z ODBC, co jest naprawdę zdecydowanie preferowanym sposobem na zrobienie czegokolwiek z SQL Server; używać SQL Native Client w systemach Windows i używać sterownika FreeTDS ODBC na systemach * 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"; 
?> 

Kluczową rzeczą jest to, że wartość zwracana może być związany jako parametr OUT, bez konieczności restrukturyzacji składowany procedury.

+0

Również, jak wspomniano [w innym poście] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/55f21fc5-dbc0-4fe4-a4ae-f15905a4293a/return-value-param-from-stored-procedure-is-not-updated-when-a-value-is-return? forum = sqldriverforphp # 6dde4297 -b870-439d-bb03-6313ef544ab9), musisz określić długość parametru wyjściowego i nie określać długości parametru wejściowego (ciągle otrzymywałam błąd "Parametr formalny" @myParam "nie został zadeklarowany jako parametr WYJŚCIOWY, ale rzeczywisty parametr przekazany na żądanie "i pomijanie długości parametru wejściowego rozwiązało go ...) – Daniel

0

Jeśli rozumiem pytanie właściwie nie powinien mieć zadzwonić 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

prostu miał ten sam problem:

<?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(); 
    } 
} 
Powiązane problemy