Start · Sprachen · PHP · Referenz · oci_fetch_all

oci_fetch_all

Funktion

Ruft alle (oder eine begrenzte Anzahl) Datensätze einer OCI-Abfrage in ein zweidimensionales Array ab und gibt die Anzahl der abgerufenen Zeilen zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_fetch_all(resource $statement, array &$output, int $offset = 0, int $limit = -1, int $flags = OCI_FETCHSTATEMENT_BY_COLUMN | OCI_ASSOC): int|false

Beschreibung

oci_fetch_all liest das komplette Ergebnis einer Oracle-Datenbankabfrage (oder einen definierten Ausschnitt davon) in ein PHP-Array ein. Dies ist besonders praktisch, wenn alle Ergebnisdaten auf einmal verarbeitet werden sollen, ohne in einer Schleife einzeln über Zeilen zu iterieren.

Das Verhalten des Ziel-Arrays wird über den Parameter $flags gesteuert. Mit OCI_FETCHSTATEMENT_BY_ROW enthält das Array pro Index eine Zeile (zeilenorientiert), mit OCI_FETCHSTATEMENT_BY_COLUMN (Standard) enthält das Array pro Spaltenname ein Sub-Array mit allen Spaltenwerten (spaltenorientiert). Zusätzlich kann mit OCI_ASSOC oder OCI_NUM gesteuert werden, ob die Schlüssel assoziativ (Spaltenname) oder numerisch sind.

Über $offset und $limit lässt sich ein Seitenfenster (Pagination) im Ergebnis definieren: $offset gibt an, wie viele Zeilen vom Anfang übersprungen werden sollen, $limit begrenzt die maximale Anzahl abzurufender Zeilen (-1 bedeutet unbegrenzt).

Da alle Daten im Speicher gehalten werden, sollte oci_fetch_all bei sehr großen Ergebnismengen mit Bedacht eingesetzt werden. Für zeilenweises Verarbeiten ist oci_fetch_array oder oci_fetch_object in einer Schleife ressourcenschonender.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Eine gültige OCI-Statement-Ressource, die zuvor mit oci_parse erzeugt und mit oci_execute ausgeführt wurde.
$output Pflicht array Das Array, in das die Ergebnisdaten geschrieben werden. Wird als Referenz übergeben und von der Funktion befüllt. Vorhandene Inhalte werden überschrieben.
$offset int 0 Anzahl der Zeilen, die vom Beginn des Ergebnisses übersprungen werden sollen (nützlich für Pagination). Standard ist 0 (keine Zeilen überspringen).
$limit int -1 Maximale Anzahl der abzurufenden Zeilen. -1 bedeutet, dass alle verfügbaren Zeilen (nach Anwendung von $offset) abgerufen werden.
$flags int OCI_FETCHSTATEMENT_BY_COLUMN | OCI_ASSOC

Steuert die Struktur des Ausgabe-Arrays. Mögliche Werte:

  • OCI_FETCHSTATEMENT_BY_ROW — äußeres Array ist zeilenorientiert
  • OCI_FETCHSTATEMENT_BY_COLUMN — äußeres Array ist spaltenorientiert (Standard)
  • OCI_ASSOC — assoziative Schlüssel (Spaltennamen)
  • OCI_NUM — numerische Schlüssel

Kombinationen sind mit dem bitweisen OR-Operator möglich.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der in $output geschriebenen Zeilen als Integer zurück. Bei einem Fehler wird false zurückgegeben. Wenn die Abfrage keine Zeilen liefert, wird 0 zurückgegeben.

Beispiele

Alle Zeilen spaltenorientiert abrufen (Standard)

<?php
$conn = oci_connect('scott', 'tiger', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error($e['message'], E_USER_ERROR);
}

$sql = 'SELECT employee_id, last_name, salary FROM employees ORDER BY employee_id';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

$rows = oci_fetch_all($stmt, $result);
echo "Anzahl Zeilen: $rows\n";

// $result ist spaltenorientiert (Standard: OCI_FETCHSTATEMENT_BY_COLUMN | OCI_ASSOC)
print_r($result);

// Ausgabe z. B.:
// Array
// (
//     [EMPLOYEE_ID] => Array ( [0] => 100 [1] => 101 ... )
//     [LAST_NAME]   => Array ( [0] => King [1] => Kochhar ... )
//     [SALARY]      => Array ( [0] => 24000 [1] => 17000 ... )
// )

oci_free_statement($stmt);
oci_close($conn);
Anzahl Zeilen: 107

Zeilenorientiertes Abrufen mit Pagination (Offset und Limit)

<?php
$conn = oci_connect('scott', 'tiger', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error($e['message'], E_USER_ERROR);
}

$sql = 'SELECT employee_id, last_name FROM employees ORDER BY employee_id';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

// Zeilen 11–20 abrufen (Offset 10, Limit 10), zeilenorientiert
$rows = oci_fetch_all(
    $stmt,
    $result,
    10,   // Offset: erste 10 Zeilen überspringen
    10,   // Limit: maximal 10 Zeilen holen
    OCI_FETCHSTATEMENT_BY_ROW | OCI_ASSOC
);

echo "Geladene Zeilen: $rows\n";
foreach ($result as $row) {
    echo $row['EMPLOYEE_ID'] . ' – ' . $row['LAST_NAME'] . "\n";
}

oci_free_statement($stmt);
oci_close($conn);
Geladene Zeilen: 10 110 – Chen 111 – Sciarra ...

// Wichtig · Fallstricke

Speicherverbrauch: Da oci_fetch_all alle Ergebniszeilen auf einmal in den PHP-Speicher lädt, kann es bei sehr großen Resultsets zu hohem Speicherverbrauch führen. In solchen Fällen ist es besser, mit oci_fetch_array in einer Schleife zeilenweise zu verarbeiten.

Spaltennamen: Spaltennamen werden von Oracle in Großbuchstaben zurückgegeben (z. B. LAST_NAME), sofern keine Alias-Ausdrücke mit Anführungszeichen im SQL verwendet werden.

Reihenfolge der Flags: OCI_FETCHSTATEMENT_BY_ROW und OCI_FETCHSTATEMENT_BY_COLUMN schließen sich gegenseitig aus. Ebenso schließen sich OCI_ASSOC und OCI_NUM gegenseitig aus, sofern nicht OCI_BOTH verwendet wird.

Cursor-Position: Nach dem Aufruf von oci_fetch_all ist der interne Cursor am Ende des Ergebnisses; ein erneuter Aufruf ohne erneutes Ausführen des Statements liefert 0 Zeilen.