Start · Sprachen · PHP · Referenz · odbc_next_result

odbc_next_result

Funktion

Prüft, ob ein ODBC-Statement weitere Ergebnismengen enthält, und wechselt ggf. zur nächsten.

seit PHP 4.0.5 Kategorie: db

Signatur

odbc_next_result(resource $statement): bool

Beschreibung

odbc_next_result wird verwendet, wenn eine gespeicherte Prozedur oder eine Batch-Abfrage über ODBC mehrere Ergebnismengen (Result Sets) zurückliefert. Nach dem Verarbeiten der ersten Ergebnismenge kann mit dieser Funktion zur nächsten gewechselt werden.

Die Funktion gibt true zurück, wenn eine weitere Ergebnismenge verfügbar ist, und stellt das interne Zeigerwerk des Statements auf diese um. Anschließend können die Zeilen wie gewohnt mit odbc_fetch_row, odbc_fetch_array oder ähnlichen Funktionen abgerufen werden. Gibt es keine weitere Ergebnismenge mehr, wird false zurückgegeben.

Diese Funktion ist besonders nützlich, wenn man gegen Microsoft SQL Server oder andere Datenbanksysteme arbeitet, die Batch-Statements oder Stored Procedures mit mehreren SELECT-Ausgaben unterstützen. Ohne odbc_next_result würde man nur die erste Ergebnismenge sehen und alle weiteren ignorieren.

  • Gilt nur für ODBC-Verbindungen (odbc_connect).
  • Funktioniert nur, wenn der ODBC-Treiber mehrere Ergebnismengen unterstützt.
  • Muss in einer Schleife aufgerufen werden, um alle Ergebnismengen zu verarbeiten.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges ODBC-Statement-Handle, wie es von odbc_exec oder odbc_execute zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn eine weitere Ergebnismenge vorhanden ist und das Statement erfolgreich auf diese umgestellt wurde. Gibt false zurück, wenn keine weiteren Ergebnismengen verfügbar sind oder ein Fehler aufgetreten ist.

Beispiele

Verarbeitung mehrerer Ergebnismengen einer Stored Procedure

<?php
$conn = odbc_connect('MeinDSN', 'benutzer', 'geheim');

if (!$conn) {
    die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}

// Stored Procedure, die mehrere SELECT-Ergebnisse zurückgibt
$stmt = odbc_exec($conn, 'EXEC sp_meine_prozedur');

if (!$stmt) {
    die('Abfrage fehlgeschlagen: ' . odbc_errormsg($conn));
}

$resultSetNr = 1;
do {
    echo "=== Ergebnismenge #{$resultSetNr} ===".PHP_EOL;
    while (odbc_fetch_row($stmt)) {
        $numCols = odbc_num_fields($stmt);
        for ($i = 1; $i <= $numCols; $i++) {
            echo odbc_field_name($stmt, $i) . ': ' . odbc_result($stmt, $i) . '  ';
        }
        echo PHP_EOL;
    }
    $resultSetNr++;
} while (odbc_next_result($stmt));

odbc_free_result($stmt);
odbc_close($conn);
?>
=== Ergebnismenge #1 === ID: 1 Name: Alice ID: 2 Name: Bob === Ergebnismenge #2 === GesamtAnzahl: 2

Batch-SQL mit mehreren SELECT-Anweisungen

<?php
$conn = odbc_connect('MeinDSN', 'benutzer', 'geheim');

// Mehrere SELECT-Abfragen als Batch
$sql = "SELECT 'Kunden' AS Quelle, COUNT(*) AS Anzahl FROM kunden;
        SELECT 'Bestellungen' AS Quelle, COUNT(*) AS Anzahl FROM bestellungen;";

$stmt = odbc_exec($conn, $sql);

$sets = [];
do {
    $rows = [];
    while ($row = odbc_fetch_array($stmt)) {
        $rows[] = $row;
    }
    $sets[] = $rows;
} while (odbc_next_result($stmt));

foreach ($sets as $idx => $set) {
    echo "Ergebnismenge " . ($idx + 1) . ":" . PHP_EOL;
    foreach ($set as $row) {
        echo '  ' . $row['Quelle'] . ': ' . $row['Anzahl'] . PHP_EOL;
    }
}

odbc_free_result($stmt);
odbc_close($conn);
?>
Ergebnismenge 1: Kunden: 150 Ergebnismenge 2: Bestellungen: 430

// Wichtig · Fallstricke

Treiberabhängigkeit: Nicht alle ODBC-Treiber unterstützen mehrere Ergebnismengen. Stellen Sie sicher, dass der verwendete Treiber (z. B. für MS SQL Server, Sybase) dies explizit unterstützt. Bei ungeeigneten Treibern gibt die Funktion immer false zurück.

Ressourcenverwaltung: Nach dem Durchlaufen aller Ergebnismengen sollte das Statement-Handle mit odbc_free_result freigegeben werden, um Speicher zu vermeiden.

Fehlerbehandlung: Ein Rückgabewert von false kann sowohl das Ende aller Ergebnismengen als auch einen Fehler signalisieren. Im Zweifelsfall sollte odbc_errormsg zur Diagnose herangezogen werden.