Start · Sprachen · PHP · Referenz · db2_lob_read

db2_lob_read

Funktion

Liest einen Abschnitt von LOB-Daten (Large Object) aus einer Ergebnismenge in benutzerdefinierter Größe je Aufruf.

seit PHP 5.2.0 Kategorie: db

Signatur

db2_lob_read(resource $stmt, int $colnum, int $length): string|false

Beschreibung

db2_lob_read() ermöglicht das schrittweise Lesen von LOB-Daten (Large Objects) aus einer Ergebnismenge, die mit einer IBM DB2-Datenbankverbindung abgerufen wurde. Die Funktion liest bei jedem Aufruf einen Datenblock der angegebenen Länge aus der angegebenen Spalte des aktuellen Datensatzes.

Diese Funktion ist besonders nützlich, wenn große BLOB- (Binary Large Object) oder CLOB- (Character Large Object) Werte verarbeitet werden müssen, da sie nicht den gesamten LOB-Inhalt auf einmal in den Speicher laden muss. Stattdessen kann der Inhalt in Chunks gelesen und beispielsweise direkt in eine Datei oder einen Ausgabepuffer geschrieben werden.

Um db2_lob_read() nutzen zu können, muss die Abfrage zuvor mit db2_execute() ausgeführt und der Cursor auf einen Datensatz positioniert worden sein (z. B. via db2_fetch_row()). Die Spaltennummer ist dabei 1-basiert.

Wird die Funktion wiederholt für dieselbe Spalte und denselben Datensatz aufgerufen, wird der interne Lesezeiger automatisch weitergesetzt, sodass nachfolgende Aufrufe den jeweils nächsten Block liefern. Gibt es keine weiteren Daten, wird false zurückgegeben.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Ein gültiges Statement-Resource-Handle, das durch db2_prepare() erzeugt und mit db2_execute() ausgeführt wurde. Der Cursor muss auf einen gültigen Datensatz zeigen.
$colnum Pflicht int Die 1-basierte Nummer der Spalte in der Ergebnismenge, aus der die LOB-Daten gelesen werden sollen.
$length Pflicht int Die maximale Anzahl der Bytes (bei BLOB) bzw. Zeichen (bei CLOB), die bei diesem Aufruf gelesen werden sollen.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen string mit den gelesenen LOB-Daten zurück. Wenn keine weiteren Daten vorhanden sind oder ein Fehler auftritt, wird false zurückgegeben.

Beispiele

CLOB-Inhalt in Blöcken lesen und ausgeben

<?php
$conn = db2_connect('SAMPLE', 'db2inst1', 'ibmdb2');

if ($conn) {
    $sql = 'SELECT id, dokument FROM texte WHERE id = 1';
    $stmt = db2_prepare($conn, $sql);

    if (db2_execute($stmt)) {
        if (db2_fetch_row($stmt)) {
            $chunkSize = 1024; // 1 KB je Lesevorgang
            $spalte = 2;       // Spalte 'dokument' ist die zweite Spalte

            echo "Dokument-Inhalt:\n";
            while (($chunk = db2_lob_read($stmt, $spalte, $chunkSize)) !== false) {
                echo $chunk;
            }
        } else {
            echo 'Kein Datensatz gefunden.';
        }
    } else {
        echo 'Fehler bei der Ausführung: ' . db2_stmt_errormsg($stmt);
    }

    db2_close($conn);
} else {
    echo 'Verbindungsfehler: ' . db2_conn_errormsg();
}
?>
Dokument-Inhalt: (Inhalt des CLOB-Feldes in 1-KB-Blöcken)

BLOB-Daten in eine Datei schreiben

<?php
$conn = db2_connect('SAMPLE', 'db2inst1', 'ibmdb2');

if ($conn) {
    $sql = 'SELECT datei_name, datei_inhalt FROM dateien WHERE id = 42';
    $stmt = db2_prepare($conn, $sql);

    if (db2_execute($stmt) && db2_fetch_row($stmt)) {
        $dateiName = db2_result($stmt, 1); // Dateiname aus Spalte 1
        $zielPfad  = '/tmp/' . basename($dateiName);
        $handle    = fopen($zielPfad, 'wb');

        if ($handle) {
            $chunkSize = 8192; // 8 KB je Lesevorgang
            while (($chunk = db2_lob_read($stmt, 2, $chunkSize)) !== false) {
                fwrite($handle, $chunk);
            }
            fclose($handle);
            echo "Datei erfolgreich gespeichert: $zielPfad";
        } else {
            echo 'Konnte Zieldatei nicht öffnen.';
        }
    }

    db2_close($conn);
}
?>
Datei erfolgreich gespeichert: /tmp/beispiel.pdf

// Wichtig · Fallstricke

Speichermanagement: Der größte Vorteil von db2_lob_read() gegenüber db2_result() liegt im kontrollierten Speicherverbrauch. Bei sehr großen LOBs (mehrere MB oder GB) verhindert das blockweise Lesen, dass der gesamte Inhalt auf einmal im PHP-Arbeitsspeicher gehalten werden muss.

Reihenfolge der Aufrufe: Der interne Lesezeiger wird pro Spalte und Datensatz verwaltet. Wird ein neuer Datensatz mit db2_fetch_row() abgerufen, startet der Zeiger für alle Spalten wieder von vorne.

Verfügbarkeit: Diese Funktion steht nur zur Verfügung, wenn die IBM DB2-Erweiterung (ibm_db2) installiert und aktiviert ist. Sie ist nicht Teil der PDO- oder ODBC-Erweiterung.