Start · Sprachen · PHP · Referenz · oci_fetch_object

oci_fetch_object

Funktion

Liefert die nächste Ergebniszeile einer Oracle-Abfrage als <code>stdClass</code>-Objekt zurück, wobei Spaltennamen als Objekteigenschaften abgebildet werden.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_fetch_object(resource $statement): stdClass|false

Beschreibung

oci_fetch_object() ruft die nächste Zeile aus einem ausgeführten Oracle-Statement ab und gibt sie als stdClass-Objekt zurück. Die Spaltennamen der Abfrage werden dabei zu Eigenschaftsnamen des Objekts. Dies ermöglicht einen objektorientierten Zugriff auf Abfrageergebnisse, der in vielen modernen PHP-Anwendungen bevorzugt wird.

Spaltennamen werden von Oracle standardmäßig in Großbuchstaben zurückgegeben. Das bedeutet, dass die Eigenschaftsnamen des zurückgegebenen Objekts ebenfalls in Großbuchstaben vorliegen, sofern keine Aliasse mit expliziten Anführungszeichen im SQL verwendet werden. Beispiel: Eine Spalte employee_name wird als $row->EMPLOYEE_NAME angesprochen.

Die Funktion eignet sich besonders dann, wenn Datensätze als Objekte weiterverarbeitet werden sollen – etwa bei der Übergabe an typisierte Methoden oder Templates. Sie wird in einer Schleife eingesetzt, bis sie false zurückgibt, was das Ende der Ergebnismenge signalisiert.

oci_fetch_object() ist funktional vergleichbar mit oci_fetch_assoc(), liefert jedoch statt eines assoziativen Arrays ein Objekt. Bei großen Datenmengen kann es sinnvoller sein, Zeilen schrittweise per Schleife abzurufen, anstatt alle Zeilen auf einmal mit oci_fetch_all() zu laden.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges OCI-Statement-Handle, das zuvor mit oci_parse() erzeugt und mit oci_execute() ausgeführt wurde.

Rückgabewert

Typ
stdClass|false
Beschreibung
Gibt ein stdClass-Objekt zurück, dessen Eigenschaften den Spaltenwerten der aktuellen Zeile entsprechen. Gibt false zurück, wenn keine weiteren Zeilen vorhanden sind oder ein Fehler aufgetreten ist.

Beispiele

Alle Zeilen einer Abfrage als Objekte auslesen

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

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

while ($row = oci_fetch_object($stmt)) {
    // Oracle gibt Spaltennamen in Großbuchstaben zurück
    echo $row->EMPLOYEE_ID . ': ' . $row->FIRST_NAME . ' ' . $row->LAST_NAME . PHP_EOL;
}

oci_free_statement($stmt);
oci_close($conn);
100: Steven King 101: Neena Kochar 102: Lex De Haan ...

Spaltennamen via Alias in Kleinbuchstaben verwenden

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

// Durch den Alias in doppelten Anführungszeichen werden Kleinbuchstaben erzwungen
$sql = 'SELECT employee_id AS "id", first_name AS "firstName", salary AS "salary" FROM employees WHERE rownum <= 3';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

while ($row = oci_fetch_object($stmt)) {
    printf("ID: %d | Name: %s | Gehalt: %.2f\n",
        $row->id,
        $row->firstName,
        $row->salary
    );
}

oci_free_statement($stmt);
oci_close($conn);
ID: 100 | Name: Steven | Gehalt: 24000.00 ID: 101 | Name: Neena | Gehalt: 17000.00 ID: 102 | Name: Lex | Gehalt: 17000.00

// Wichtig · Fallstricke

Großschreibung der Spaltennamen: Oracle gibt Spaltennamen standardmäßig in Großbuchstaben zurück. Zugriffe auf Objekteigenschaften müssen daher entsprechend in Großbuchstaben erfolgen (z. B. $row->LAST_NAME), es sei denn, im SQL werden explizit in Anführungszeichen gesetzte Aliasse verwendet.

LOB-Spalten: Bei der Rückgabe von LOB-Werten (z. B. CLOB) enthält die Eigenschaft ein OCI-LOB-Deskriptor-Objekt. Der eigentliche Inhalt muss mit der Methode load() oder read() des Deskriptors abgerufen werden.

NULL-Werte: Datenbankfelder mit dem Wert NULL werden in PHP als null zurückgegeben.

Performance: Bei sehr großen Ergebnismengen empfiehlt es sich, oci_fetch_object() in Kombination mit dem Prefetch-Mechanismus von OCI8 zu nutzen oder auf oci_fetch_all() zurückzugreifen, wenn alle Daten auf einmal benötigt werden.