Signatur
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.";
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.