Start · Sprachen · PHP · Referenz · oci_new_descriptor

oci_new_descriptor

Funktion

Initialisiert einen neuen, leeren LOB- oder FILE-Deskriptor für eine Oracle-Datenbankverbindung.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_new_descriptor(resource $connection, int $type = OCI_DTYPE_LOB): OCILob|false

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

Typ
OCILob|false
Beschreibung
Gibt ein 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.";
?>
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.