2014-02-11 133 views
1

我想從laravel中的存儲過程中獲取多個結果集。有什麼辦法可以做到這一點? 目前,我可以使用下面的代碼獲取單個行的數據:如何從laravel中的mysql存儲過程中獲取多個結果集

$result = DB::statement('CALL user_login(' . $userId . ',"' 
                   . $password . '",' 
                   . '@success'.',' 
                   . '@first_Name' 
                  ); 

$res = DB::select('select @success AS success, @first_Name AS firstName); 

Here is my stored procedure: 

DELIMITER // 

DROP PROCEDURE IF EXISTS user_login// 

create procedure user_login (IN userid VARCHAR(50), 
            IN password VARCHAR(50), 
            out success int, 
            OUT first_Name VARCHAR(255), 
            ) 

begin 

declare count int(1); 
set count =0; 

select firstName, count(*) 
into first_Name, count 
from `tmc`.user where user_id = userid and pwd=password; 

if count >0 then 

set success =0; 

else 
set success=1; 

end if; 

end// 

回答

2

我使用下面的代碼,它完美的作品。改變它以適應您的需求。

public static function CallRaw($procName, $parameters = null, $isExecute = false) 
{ 
    $syntax = ''; 
    for ($i = 0; $i < count($parameters); $i++) { 
     $syntax .= (!empty($syntax) ? ',' : '') . '?'; 
    } 
    $syntax = 'CALL ' . $procName . '(' . $syntax . ');'; 

    $pdo = DB::connection()->getPdo(); 
    $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true); 
    $stmt = $pdo->prepare($syntax,[\PDO::ATTR_CURSOR=>\PDO::CURSOR_SCROLL]); 
    for ($i = 0; $i < count($parameters); $i++) { 
     $stmt->bindValue((1 + $i), $parameters[$i]); 
    } 
    $exec = $stmt->execute(); 
    if (!$exec) return $pdo->errorInfo(); 
    if ($isExecute) return $exec; 

    $results = []; 
    do { 
     try { 
      $results[] = $stmt->fetchAll(\PDO::FETCH_OBJ); 
     } catch (\Exception $ex) { 

     } 
    } while ($stmt->nextRowset()); 


    if (1 === count($results)) return $results[0]; 
    return $results; 
} 

例呼叫:

$params = ['2014-01-01','2014-12-31',100]; 
$results = APIDB::CallRaw('spGetData',$params); 

所得呼叫將是:

CALL spGetData(?,?,?) 

如果只有一個結果,因爲它是將被返回。如果還有更多,它將返回一組結果集。關鍵是使用$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);。沒有它,一個可怕的異常將被拋出。

try {} catch()塊用於消除無法獲取的結果集。特別是,我有返回兩個結果集的過程,其中一個作爲更新(或其他執行語句)的結果,最後一個作爲實際數據。執行查詢時在fetchAll()上拋出的異常將爲PDOException

警告:該功能未優化。您可以通過參數一次重寫它。

相關問題