sql >> Database >  >> RDS >> Mysql

hoe meerdere resultatensets op te halen uit een mysql-opgeslagen procedure in laravel

Ik gebruik de volgende code en het werkt perfect. Pas het aan uw behoeften aan.

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;
}

Voorbeeld oproep:

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

De resulterende oproep zal zijn:

CALL spGetData(?,?,?)

Als er slechts één resultatenset is, wordt deze geretourneerd zoals deze is. Als er meer zijn, wordt een reeks resultatensets geretourneerd. De sleutel gebruikt $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true); . Zonder dit een vreselijke SQLSTATE[HY000]: General error: 2053 uitzondering wordt gegenereerd.

Het blok try{} catch() wordt gebruikt om de resultatensets die niet kunnen worden opgehaald, te verwijderen. In het bijzonder heb ik procedures die twee resultatensets retourneren, één als resultaat van een update (of andere uitvoerinstructies) en de laatste als de echte gegevens. De uitzondering die wordt gegenereerd op fetchAll() met een execute-query is PDOException .

Waarschuwing:de functie is niet geoptimaliseerd. U kunt het herschrijven met één enkele doorgang door de parameters.



  1. SQLite-queryresultaten weergeven met verticale uitvoer

  2. Toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord:JA) - Geen rechten?

  3. Database maken in MySQL

  4. Hoe maak je goed gebruik van multicore CPU's in je PHP/MySQL-applicaties?