2009-06-12 35 views
5

Tôi đang làm việc với một thủ tục lưu trữ SQL Server trả về mã lỗi; đây là một đoạn rất đơn giản của SP.PDO Lưu trữ thủ tục trả về giá trị

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

tôi có thể nhận giá trị trả về với phần mở rộng MSSQL sử dụng:

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

Tuy nhiên, tôi không thể tìm ra cách để truy cập giá trị trả về trong PDO; Tôi không muốn sử dụng tham số OUT, vì rất nhiều các thủ tục lưu sẵn này đã được viết. Đây là một ví dụ về cách tôi hiện đang gọi thủ tục trong 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

Tôi gặp sự cố tương tự, hãy xem: http://stackoverflow.com/questions/21466503/calling-stored-procedure-from-php-using-pdo-to-m ssql-server-using-input-paramter –

+0

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

Trả lời

0

bạn không thể sử dụng SELECT để trả về kết quả? Sau đó, bạn có thể sử dụng tập dữ liệu (resultset trong php?) Để chọn nó? Tôi không biết PHP, nhưng trong C# nó khá đơn giản - sử dụng tập dữ liệu.

0

khá chắc chắn PDO :: exec chỉ trả lại số hàng .. này sẽ là $ rs trong ví dụ của bạn

-1

Hãy thử $ return_value

3

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

mã PHP của bạn có lẽ nên được tinh chỉnh để tìm kiếm hơn như thế này. Điều này chỉ có thể hoạt động nếu bạn đang gọi thông qua ODBC, đó là một cách trung thực được ưu tiên mạnh mẽ để làm bất cứ điều gì với SQL Server; sử dụng SQL Native Client trên các hệ thống Windows, và sử dụng trình điều khiển freetds ODBC trên hệ thống * 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"; 
?> 

Điều quan trọng ở đây là giá trị trả về có thể bị ràng buộc như một tham số OUT, mà không cần phải tái cơ cấu lưu trữ thủ tục.

+0

Ngoài ra, như đã đề cập [trên một bài đăng khác] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/55f21fc5-dbc0-4fe4-a4ae-f15905a4293a/return-value-param-từ-được lưu trữ-thủ tục-là-không-cập nhật-khi-một-giá trị-được-trả lại? forum = sqldriverforphp # 6dde4297 -b870-439d-bb03-6313ef544ab9), bạn phải xác định chiều dài của tham số đầu ra và không chỉ định chiều dài của tham số đầu vào (tôi tiếp tục nhận được lỗi "Tham số chính thức" @myParam "không được khai báo là tham số OUTPUT, nhưng thực tế tham số được truyền trong đầu ra được yêu cầu "và bỏ qua chiều dài tham số đầu vào đã giải quyết được nó ...) – Daniel

0

Nếu tôi hiểu câu hỏi của bạn đúng, bạn không nên phải gọi 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

Chỉ cần có cùng một vấn đề này:

<?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(); 
    } 
} 
Các vấn đề liên quan