如何从laravel中的mysql存储过程中获取多个结果集

如何从laravel中的mysql存储过程中获取多个结果集

问题描述:

我想从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// 

我使用下面的代码,它完美的作品。改变它以适应您的需求。

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

警告:该功能未优化。您可以通过参数一次重写它。