sql >> Database teknologi >  >> RDS >> Mysql

hvordan man henter flere resultatsæt fra en mysql-lagret procedure i laravel

Jeg bruger følgende kode, og det fungerer upåklageligt. Skift det, så det passer til dine behov.

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

Eksempelopkald:

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

Det resulterende opkald vil være:

CALL spGetData(?,?,?)

Hvis der kun er ét resultatsæt, returneres det, som det er. Hvis der er flere, vil det returnere en række resultatsæt. Nøglen bruger $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true); . Uden det, en forfærdelig SQLSTATE[HY000]: General error: 2053 undtagelse vil blive kastet.

Try{} catch()-blokken bruges til at eliminere de resultatsæt, der ikke kan hentes. Især har jeg procedurer, der returnerer to resultatsæt, det ene som et resultat af en opdatering (eller andre udfør-sætninger) og det sidste som de rigtige data. Undtagelsen kastet på fetchAll() med en execute-forespørgsel vil være PDOException .

Advarsel:Funktionen er ikke optimeret. Du kan omskrive det med en enkelt gennemgang af parametrene.



  1. Begrænsning af parallelle/samtidige downloads - Hvordan ved man, om download blev annulleret?

  2. Maksimal længde for tekst af MySQL-typen

  3. Introduktion til midlertidige tabeller i SQL Server

  4. Sådan får du de seneste funktioner i Office 365