Signatur
Beschreibung
oci_new_descriptor() erstellt einen neuen, leeren Deskriptor für Oracle Large Objects (LOBs) oder externe Dateien (BFILEs). LOBs (Large Objects) ermöglichen die Speicherung großer Datenmengen wie Texte (CLOB), Binärdaten (BLOB) oder externe Dateipfade (BFILE) in einer Oracle-Datenbank.
Der zurückgegebene OCILob-Deskriptor wird typischerweise zusammen mit oci_bind_by_name() verwendet, um LOB-Werte an SQL- oder PL/SQL-Anweisungen zu binden — entweder um Daten in die Datenbank zu schreiben oder aus ihr zu lesen. Der $type-Parameter legt fest, ob es sich um einen CLOB, BLOB oder BFILE handelt.
Mögliche Werte für $type sind: OCI_DTYPE_LOB (Standard, für CLOB/BLOB), OCI_DTYPE_FILE (für BFILE) und OCI_DTYPE_ROWID (für ROWID-Deskriptoren). Nach der Verwendung sollte der Deskriptor mit OCILob::free() freigegeben werden, um Ressourcen zu schonen.
Diese Funktion ist besonders wichtig beim Einfügen oder Aktualisieren von LOB-Daten über das INSERT ... RETURNING INTO-Muster von Oracle, da Oracle LOBs nicht direkt wie normale Werte übergeben werden können.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection Pflicht | resource | Eine gültige Oracle-Verbindungsressource, die z. B. mit oci_connect() erstellt wurde. |
|
| $type | int | OCI_DTYPE_LOB | Der Typ des Deskriptors. Mögliche Werte: OCI_DTYPE_LOB (CLOB/BLOB), OCI_DTYPE_FILE (BFILE) oder OCI_DTYPE_ROWID (ROWID). |
Rückgabewert
OCILob-Objekt zurück, das den neuen Deskriptor repräsentiert. Bei einem Fehler wird false zurückgegeben.Beispiele
CLOB in Oracle-Datenbank einfügen
<?php
$conn = oci_connect('hr', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$clob = oci_new_descriptor($conn, OCI_DTYPE_LOB);
$sql = "INSERT INTO documents (id, content) VALUES (1, EMPTY_CLOB()) RETURNING content INTO :clob";
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':clob', $clob, -1, OCI_B_CLOB);
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
$clob->save('Dies ist ein langer Textinhalt für den CLOB.');
oci_commit($conn);
$clob->free();
oci_free_statement($stmt);
oci_close($conn);
echo "CLOB erfolgreich gespeichert.";
?>
BLOB aus Oracle-Datenbank lesen
<?php
$conn = oci_connect('hr', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$blob = oci_new_descriptor($conn, OCI_DTYPE_LOB);
$sql = "SELECT image FROM pictures WHERE id = 42";
$stmt = oci_parse($conn, $sql);
oci_define_by_name($stmt, 'IMAGE', $blob, OCI_B_BLOB);
oci_execute($stmt);
oci_fetch($stmt);
$bildDaten = $blob->load();
header('Content-Type: image/jpeg');
echo $bildDaten;
$blob->free();
oci_free_statement($stmt);
oci_close($conn);
?>
// Wichtig · Fallstricke
Ressourcenverwaltung: Deskriptoren belegen Oracle-Ressourcen. Rufen Sie immer OCILob::free() auf, wenn der Deskriptor nicht mehr benötigt wird, um Speicherlecks zu vermeiden.
Transaktionen: LOB-Operationen sollten innerhalb einer Transaktion durchgeführt werden. Verwenden Sie OCI_NO_AUTO_COMMIT in oci_execute() und schließen Sie die Transaktion explizit mit oci_commit() ab.
BFILE-Einschränkung: BFILE-Deskriptoren (OCI_DTYPE_FILE) sind schreibgeschützt — sie zeigen auf Dateien im Oracle-Datenbankserver-Dateisystem und können nicht zum Schreiben verwendet werden.
Diese Funktion setzt die OCI8-Erweiterung voraus, die mit Oracle-Client-Bibliotheken kompiliert wurde.