Start · Sprachen · PHP · Referenz · OCILob

OCILob

Klasse

Repräsentiert ein OCI8-LOB-Objekt (Large Object) für den Umgang mit großen Binär- (<code>BLOB</code>) und Zeichenobjekten (<code>CLOB</code>) in Oracle-Datenbanken.

seit PHP 5.0.0 Kategorie: db

Signatur

class OCILob

Beschreibung

OCILob (auch bekannt als OCI-Lob) ist eine PHP-Klasse aus der OCI8-Erweiterung und ermöglicht den Zugriff auf Large Objects in Oracle-Datenbanken. Sie wird verwendet, wenn Datenbankfelder vom Typ BLOB (Binary Large Object) oder CLOB (Character Large Object) gelesen oder geschrieben werden müssen – also für Inhalte wie Bilder, PDFs, XML-Dokumente oder sehr lange Texte, die nicht effizient als reguläre Zeichenkette übertragen werden können.

Ein OCILob-Objekt wird nicht direkt instantiiert, sondern entsteht, wenn OCI8-Funktionen wie oci_new_descriptor() aufgerufen werden oder wenn ein LOB-Wert aus einer SELECT-Abfrage gelesen wird. Über die Methoden der Klasse kann der LOB-Inhalt gelesen (load(), read()), geschrieben (write(), writeToFile()) oder anderweitig verwaltet werden.

Wichtig: Beim Schreiben in einen LOB muss in der Regel eine offene Transaktion vorliegen. Nach dem Schreiben muss explizit oci_commit() aufgerufen werden, da LOB-Operationen standardmäßig nicht automatisch committed werden. Außerdem sollten LOB-Ressourcen mit free() freigegeben werden, sobald sie nicht mehr benötigt werden, um Speicherlecks zu vermeiden.

Ab PHP 8.0 wurde die Klasse offiziell in OCILob umbenannt; der frühere Alias OCI-Lob steht weiterhin zur Verfügung. Die Klasse kann nicht direkt durch new OCILob() erzeugt werden, da sie ausschließlich durch OCI8-interne Mechanismen instanziiert wird.

Beispiele

CLOB in Oracle-Tabelle schreiben

<?php
$conn = oci_connect('benutzer', 'passwort', 'dbhost/XE');

// Leeren LOB-Deskriptor erstellen
$clob = oci_new_descriptor($conn, OCI_D_LOB);

$sql = "INSERT INTO dokumente (id, inhalt) VALUES (1, EMPTY_CLOB()) RETURNING inhalt INTO :clob";
$stmt = oci_parse($conn, $sql);

// LOB-Bindung
oci_bind_by_name($stmt, ':clob', $clob, -1, OCI_B_CLOB);

// Autocommit deaktivieren (wichtig bei LOB-Writes)
oci_execute($stmt, OCI_NO_AUTO_COMMIT);

// Inhalt in den CLOB schreiben
$clob->write('Dies ist ein langer Dokumententext...');

// Transaktion abschließen
oci_commit($conn);

// Ressourcen freigeben
$clob->free();
oci_free_statement($stmt);
oci_close($conn);

echo "CLOB erfolgreich gespeichert.";
CLOB erfolgreich gespeichert.

BLOB aus der Datenbank lesen und als Datei ausgeben

<?php
$conn = oci_connect('benutzer', 'passwort', 'dbhost/XE');

$sql = "SELECT bild FROM bilder WHERE id = :id";
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':id', $id);

$id = 42;
oci_execute($stmt);

$row = oci_fetch_assoc($stmt);
if ($row && $row['BILD'] instanceof OCILob) {
    /** @var OCILob $blob */
    $blob = $row['BILD'];

    // Gesamten BLOB-Inhalt laden
    $bildDaten = $blob->load();
    $blob->free();

    header('Content-Type: image/jpeg');
    header('Content-Length: ' . strlen($bildDaten));
    echo $bildDaten;
} else {
    echo "Bild nicht gefunden.";
}

oci_free_statement($stmt);
oci_close($conn);

LOB-Inhalt schrittweise lesen mit read()

<?php
$conn = oci_connect('benutzer', 'passwort', 'dbhost/XE');

$sql = "SELECT inhalt FROM dokumente WHERE id = 1";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

$row = oci_fetch_assoc($stmt);
if ($row) {
    /** @var OCILob $clob */
    $clob = $row['INHALT'];

    // LOB-Zeiger auf den Anfang setzen
    $clob->rewind();

    // In 8-KB-Blöcken lesen
    while (!$clob->eof()) {
        $chunk = $clob->read(8192);
        echo $chunk;
    }

    $clob->free();
}

oci_free_statement($stmt);
oci_close($conn);

// Wichtig · Fallstricke

Transaktionsverwaltung: LOB-Schreiboperationen erfordern zwingend eine offene Transaktion. Verwenden Sie oci_execute($stmt, OCI_NO_AUTO_COMMIT) und schließen Sie die Transaktion anschließend mit oci_commit() ab. Wird dies vergessen, gehen die LOB-Daten verloren.

Speicherverwaltung: Rufen Sie nach der Verwendung immer OCILob::free() auf, da LOB-Objekte Oracle-seitige Ressourcen belegen. Bei vielen LOB-Zugriffen in einer Schleife kann das Vergessen von free() zu erheblichem Speicher- und Verbindungsressourcenverbrauch führen.

Zeichensatz bei CLOBs: Beim Schreiben von CLOBs ist der Datenbankzeichensatz (NLS_CHARACTERSET) zu beachten. Bei Unterschieden zwischen PHP-Kodierung und Datenbankzeichensatz können Umlaute und Sonderzeichen korrumpiert werden.

PHP 8.0+: In PHP 8.0 wurde der Klassenname von OCI-Lob (mit Bindestrich) zu OCILob geändert. Der alte Name ist als Alias weiterhin verfügbar, sollte aber in neuem Code nicht mehr verwendet werden.