PDO::nextRowset() does not appear to be currently supported by the Firebird PDO driver. Unfortunate.
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDOStatement::nextRowset — Rückt in einem Anweisungshandle mit mehreren Sätzen von Zeilen (Rowsets) zum nächsten vor
Einige Datenbankserver unterstützen gespeicherte Prozeduren, die mehr als einen Satz von Zeilen (sog. Rowsets, auch Ergebnismenge genannt) zurückgeben. PDOStatement::nextRowset() ermöglicht den Zugriff auf den zweiten und die folgenden Sätze von Zeilen, die zu einem PDOStatement-Objekt gehören. Jeder Zeilensatz kann einen anderen Satz von Spalten haben als der vorhergehende Zeilensatz.
Diese Funktion besitzt keine Parameter.
Gibt bei Erfolg true
zurück. Bei einem Fehler wird false
zurückgegeben.
Beispiel #1 Abrufen mehrerer von einer gespeicherten Prozedur zurückgegebener Zeilensätze
Das folgende Beispiel zeigt, wie man eine gespeicherte Prozedur,
MULTIPLE_ROWSETS
, aufruft, die drei Zeilensätze
zurückgibt. Mit einer
do-while-Schleife wird
die Methode PDOStatement::nextRowset() so oft
aufgerufen, bis sie false
zurückgibt, und die Schleife beendet, wenn es
keine weiteren Zeilensätze mehr gibt.
<?php
$sql = 'CALL multiple_rowsets()';
$stmt = $conn->query($sql);
$i = 1;
do {
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
printResultSet($rowset, $i);
}
$i++;
} while ($stmt->nextRowset());
function printResultSet(&$rowset, $i) {
print "Ergebnismenge $i:\n";
foreach ($rowset as $row) {
foreach ($row as $col) {
print $col . "\t";
}
print "\n";
}
print "\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Ergebnismenge 1: apple red banana yellow Ergebnismenge 2: orange orange 150 banana yellow 175 Ergebnismenge 3: lime green apple red banana yellow
PDO::nextRowset() does not appear to be currently supported by the Firebird PDO driver. Unfortunate.
on MSSQL and 'dsn' => 'dblib:...',:
If you know how many count rowset then don't use contruction of do..while.
<?php
do {
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
} while (
$pdoStatement->nextRowset()
);
?>
When I get large fetchAll(over 30) for second nextRowset. I get error - Segmentation fault.
Uses step-by-step insted do..while is fix for this bug:
<?php
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
$pdoStatement->nextRowset();
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
?>
If you use PDO::fetch instead of PDO::fetchAll and do not reach the end the result set, PDO::nextRowset() will fail with "SQLSTATE[HY000]: General error: PDO_DBLIB: dbresults() returned FAIL."