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

标签 php mysql stored-procedures laravel-5 laravel-4

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

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

Mysql 导入错误 - #1005 - 无法创建表,(errno : 140 "Wrong create options")

mysql - 没有 START TRANSACTION 语句的回滚在 MySQL 存储过程中不起作用

sql - "This SqlTransaction has completed; it is no longer usable."...配置错误?

mysql - 为什么 VARCHAR 变量不能在 mysql 存储过程中使用内部查询作为列名?

php - SilverStripe:如何在另一个选项卡之前插入一个选项卡?

php - 在 Zend Framework (v1) 应用程序中使用 PHP 命名空间

php - 从全日历事件中打开 fancybox - 单击该事件将打开之前选择的事件的 url

用于数据库抽象、安全登录的 PHP 框架或库

mysql - project_measures 表最近变得很大,如何修剪