Start · Sprachen · PHP · Referenz · oci_fetch_array

oci_fetch_array

Funktion

Liefert die nächste Zeile einer Oracle-Abfrage als assoziatives, numerisches oder gemischtes Array.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_fetch_array(resource $statement, int $mode = OCI_BOTH | OCI_RETURN_NULLS): array|false

Beschreibung

oci_fetch_array() liest die nächste Zeile aus einem ausgeführten Oracle-Statement und gibt sie als Array zurück. Über den Parameter $mode wird gesteuert, ob das Array assoziative Schlüssel (Spaltennamen), numerische Indizes oder beides enthält. Die Funktion ist das Pendant zu oci_fetch_assoc() und oci_fetch_row(), bietet aber mehr Flexibilität durch den Mode-Parameter.

Typischerweise wird oci_fetch_array() in einer while-Schleife verwendet, die so lange durchläuft, bis kein weiterer Datensatz mehr vorhanden ist und false zurückgegeben wird. Standardmäßig werden NULL-Werte als PHP-null zurückgegeben, wenn OCI_RETURN_NULLS gesetzt ist.

Die Konstanten für $mode können mit dem bitweisen ODER-Operator kombiniert werden: OCI_ASSOC liefert ein assoziatives Array mit Spaltennamen als Schlüssel, OCI_NUM ein numerisch indiziertes Array, und OCI_BOTH (Standard) liefert beide Formen gleichzeitig. OCI_RETURN_LOBS sorgt dafür, dass LOB-Werte direkt als Zeichenkette statt als LOB-Deskriptor zurückgegeben werden.

Spaltennamen im assoziativen Modus sind standardmäßig in Großbuchstaben, da Oracle intern Bezeichner groß schreibt. Werden in der SQL-Abfrage Spalten-Aliase mit Anführungszeichen in Kleinschreibung definiert, spiegeln sich diese im Ergebnis wider.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges OCI8-Statement-Handle, das zuvor mit oci_parse() erzeugt und mit oci_execute() ausgeführt wurde.
$mode int OCI_BOTH | OCI_RETURN_NULLS Kombinierbare Flags, die das Rückgabeformat steuern. Mögliche Werte: OCI_ASSOC (assoziativ), OCI_NUM (numerisch), OCI_BOTH (beides), OCI_RETURN_NULLS (NULL-Werte als PHP-null), OCI_RETURN_LOBS (LOBs als String statt Deskriptor).

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array mit den Spaltenwerten der nächsten Zeile zurück. Das Format hängt vom $mode-Parameter ab. Sind keine weiteren Zeilen vorhanden, wird false zurückgegeben. Im Fehlerfall wird ebenfalls false zurückgegeben.

Beispiele

Alle Zeilen einer Abfrage mit assoziativem Array auslesen

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

$sql = 'SELECT employee_id, last_name, salary FROM employees WHERE rownum <= 5';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

while ($row = oci_fetch_array($stmt, OCI_ASSOC | OCI_RETURN_NULLS)) {
    echo $row['EMPLOYEE_ID'] . ': ' . $row['LAST_NAME'] . ' (' . $row['SALARY'] . ')' . PHP_EOL;
}

oci_free_statement($stmt);
oci_close($conn);
100: King (24000) 101: Kochhar (17000) 102: De Haan (17000) 103: Hunold (9000) 104: Ernst (6000)

LOB-Inhalte direkt als String lesen

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

$sql = 'SELECT dokument_id, inhalt FROM dokumente WHERE dokument_id = :id';
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':id', $id);
$id = 42;
oci_execute($stmt);

// OCI_RETURN_LOBS gibt den LOB-Inhalt direkt als String zurück
if ($row = oci_fetch_array($stmt, OCI_ASSOC | OCI_RETURN_LOBS)) {
    echo 'Dokument-ID: ' . $row['DOKUMENT_ID'] . PHP_EOL;
    echo 'Inhalt (erste 100 Zeichen): ' . substr($row['INHALT'], 0, 100) . PHP_EOL;
} else {
    echo 'Kein Datensatz gefunden.' . PHP_EOL;
}

oci_free_statement($stmt);
oci_close($conn);
Dokument-ID: 42 Inhalt (erste 100 Zeichen): Lorem ipsum dolor sit amet...

Numerisches Array für Index-basierten Zugriff

<?php
$conn = oci_connect('hr', 'geheim', 'localhost/XE');
$stmt = oci_parse($conn, 'SELECT department_id, department_name FROM departments WHERE rownum <= 3');
oci_execute($stmt);

while ($row = oci_fetch_array($stmt, OCI_NUM)) {
    // Zugriff über numerischen Index
    printf("ID: %d, Name: %s\n", $row[0], $row[1]);
}

oci_free_statement($stmt);
oci_close($conn);
ID: 10, Name: Administration ID: 20, Name: Marketing ID: 30, Name: Purchasing

// Wichtig · Fallstricke

Spaltennamen in Großbuchstaben: Im assoziativen Modus werden Schlüssel standardmäßig in Großbuchstaben zurückgegeben, da Oracle Bezeichner intern groß schreibt. Der Zugriff auf $row['last_name'] schlägt fehl — korrekt ist $row['LAST_NAME'].

SQL-Injection: Verwende niemals direkt verkettete Benutzereingaben in SQL-Abfragen. Nutze stets oci_bind_by_name() für parametrisierte Abfragen, um SQL-Injection-Angriffe zu verhindern.

LOB-Behandlung: Ohne OCI_RETURN_LOBS werden CLOB/BLOB-Spalten als LOB-Deskriptor-Objekte zurückgegeben, nicht als Zeichenketten. Bei großen LOBs kann OCI_RETURN_LOBS zu hohem Speicherverbrauch führen — in solchen Fällen ist das manuelle Lesen über den Deskriptor effizienter.

Performance: OCI_BOTH (der Standard) speichert jeden Wert doppelt (assoziativ und numerisch) und verbraucht dadurch mehr Speicher. Für produktiven Einsatz empfiehlt sich daher explizit OCI_ASSOC oder OCI_NUM anzugeben.