我想从 laravel 中的存储过程中获取多个结果集。有什么办法可以做到这一点? 目前,我可以使用以下代码获取单行数据:
$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);
。没有它,将抛出一个可怕的 SQLSTATE[HY000]: General error: 2053
异常。
try{} catch() block 用于消除无法获取的结果集。特别是,我有返回两个结果集的过程,一个作为更新(或其他执行语句)的结果,最后一个作为真实数据。使用执行查询在 fetchAll()
上抛出的异常将是 PDOException
。
警告:该功能未优化。您可以通过一次参数重写它。
关于php - 如何从laravel中的mysql存储过程中获取多个结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21695287/