Signatur
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
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();
}
?>
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);
}
?>
// 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.