Signatur
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:
Kombinationen sind mit dem bitweisen OR-Operator möglich. |
Rückgabewert
$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);
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);
// 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.