Start · Sprachen · PHP · Referenz · db2_next_result

db2_next_result

Funktion

Gibt das nächste Ergebnisset einer gespeicherten Prozedur zurück, die mehrere Ergebnismengen liefert.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_next_result(resource $stmt): resource|false

Beschreibung

db2_next_result() wird verwendet, wenn eine gespeicherte Prozedur (Stored Procedure) über mehrere Ergebnismengen verfügt. Nach dem Aufruf von db2_execute() oder db2_exec() liefert die Funktion das nächste Ergebnisset als neues Statement-Handle zurück, mit dem anschließend Zeilen abgerufen werden können.

Die Funktion gibt eine neue Ressource (resource) zurück, die wie ein normales Statement-Handle behandelt werden kann – also mit Funktionen wie db2_fetch_assoc(), db2_fetch_array() oder db2_fetch_object(). Solange weitere Ergebnissets vorhanden sind, gibt die Funktion bei jedem Aufruf ein neues Handle zurück. Sind alle Ergebnissets verarbeitet, wird false zurückgegeben.

Dies ist besonders nützlich, wenn man mit DB2-gespeicherten Prozeduren arbeitet, die z. B. Statistiken und Detaildaten in getrennten Ergebnismengen zurückliefern. Die Verarbeitung erfolgt typischerweise in einer Schleife, bis db2_next_result() false zurückgibt.

  • Das ursprüngliche Statement-Handle bleibt gültig und zeigt weiterhin auf das erste Ergebnisset.
  • Jedes zurückgegebene Handle kann unabhängig verwendet werden, um Zeilen abzurufen.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Ein gültiges Statement-Handle, das durch db2_exec() oder db2_execute() nach dem Aufruf einer gespeicherten Prozedur erzeugt wurde.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt eine neue Statement-Ressource für das nächste Ergebnisset zurück, wenn ein weiteres vorhanden ist. Gibt false zurück, wenn keine weiteren Ergebnissets existieren oder ein Fehler aufgetreten ist.

Beispiele

Mehrere Ergebnissets einer gespeicherten Prozedur verarbeiten

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'secret');

if ($conn) {
    // Gespeicherte Prozedur aufrufen, die zwei Ergebnissets liefert
    $stmt = db2_exec($conn, 'CALL get_orders_and_customers()');

    if ($stmt) {
        // Erstes Ergebnisset: Bestellungen
        echo "=== Bestellungen ===";
        while ($row = db2_fetch_assoc($stmt)) {
            echo "Bestell-ID: " . $row['ORDER_ID'] . ", Datum: " . $row['ORDER_DATE'] . "\n";
        }

        // Zweites Ergebnisset anfordern: Kunden
        $stmt2 = db2_next_result($stmt);
        if ($stmt2) {
            echo "=== Kunden ===";
            while ($row = db2_fetch_assoc($stmt2)) {
                echo "Kunden-ID: " . $row['CUSTOMER_ID'] . ", Name: " . $row['NAME'] . "\n";
            }
        } else {
            echo "Kein weiteres Ergebnisset vorhanden.\n";
        }
    }

    db2_close($conn);
}
=== Bestellungen === Bestell-ID: 1001, Datum: 2024-01-15 Bestell-ID: 1002, Datum: 2024-02-20 === Kunden === Kunden-ID: 42, Name: Max Mustermann Kunden-ID: 43, Name: Erika Musterfrau

Alle Ergebnissets in einer Schleife verarbeiten

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'secret');

if ($conn) {
    $stmt = db2_exec($conn, 'CALL get_multiple_results()');

    if ($stmt) {
        $resultHandle = $stmt;
        $setIndex = 1;

        do {
            echo "--- Ergebnisset #{$setIndex} ---\n";
            while ($row = db2_fetch_array($resultHandle)) {
                echo implode(', ', $row) . "\n";
            }
            $setIndex++;
            $resultHandle = db2_next_result($stmt);
        } while ($resultHandle !== false);

        echo "Alle Ergebnissets verarbeitet.\n";
    }

    db2_close($conn);
}
--- Ergebnisset #1 --- 101, Artikel A, 9.99 102, Artikel B, 14.49 --- Ergebnisset #2 --- 201, Lieferant X 202, Lieferant Y Alle Ergebnissets verarbeitet.

// Wichtig · Fallstricke

Achtung: db2_next_result() akzeptiert immer das ursprüngliche Statement-Handle als Parameter – nicht das zuletzt zurückgegebene Handle. Bei jedem Aufruf wird das jeweils nächste Ergebnisset in der Reihenfolge zurückgegeben.

Die Funktion ist nur verfügbar, wenn die PHP-Extension ibm_db2 installiert und aktiviert ist. Sie ist speziell für IBM DB2 ausgelegt und nicht für andere Datenbanken nutzbar.

Nicht alle gespeicherten Prozeduren liefern mehrere Ergebnissets. Vor dem Einsatz sollte die jeweilige Prozedur-Dokumentation geprüft werden, um sicherzustellen, dass mehrere Ergebnismengen erwartet werden.