18.9.2 | Zugriff auf BLOB und CLOB |
BLOB und CLOB wurden mit SQL-99 eingeführt und besitzen gegenüber LONG und LONG RAW meist erweiterte Funktionalität, was die interne Verwaltung im Datenbanksystem betrifft. Sie können beim Oracle-Server Daten bis zu 4 GB Größe aufnehmen und basieren beide auf so genannten LOB-Lokatoren. LOB-Lokatoren sind vereinfacht ausgedrückt Strukturen, die Zugang zu den LOB-Daten bieten. Die Daten selbst können dabei innerhalb oder außerhalb eines Datensatzes gespeichert werden.
Der Zugriff auf BLOB- und CLOB-Typen kann auch genau wie auf LONG bzw. LONG RAW durchgeführt werden, so dass die Lokatoren weitestgehend verborgen bleiben. Beim Einfügen neuer LOB-Spalten mit Oracle ist jedoch zu beachten, dass zunächst mit der Methode empty_blob() bzw. empty_clob() LOB-Lokatoren erzeugt werden müssen, die später über UPDATE-Anweisungen mit Daten gefüllt werden können:... long tit_id; // SQL-Anweisung initialisieren String sql = "INSERT INTO titel VALUES(?,?,?,?,?,?,?,empty_blob(),?,?,?)" PreparedStatement prep = con.prepareStatement(sql); // Parameter setzen und Anweisung ausführen ... prep.close(); String sql = "UPDATE titel SET bild = ? WHERE tit_id = ?"; PreparedStatement prep = con.prepareStatement(sql); // Parameter setzen und Anweisung ausführen ...Mit einer UPDATE-Anweisung auf eine BLOB- bzw. CLOB-Spalte können gleichzeitig mehrere Datensätze aktualisiert werden (im Unterschied zu LONG bzw. LONG RAW).
Mit JDBC 2.0 kann der Zugriff jedoch auch direkt über die LOB-Lokatoren durchgeführt werden. Hierfür wurden die Typen Clob bzw. Blob eingeführt. Diese Typen können direkt über das ResultSet-Exemplar mit den Methoden getBlob() bzw. setClob() abgerufen werden. Beim Abrufen dieser Typen werden noch keine Daten aus dem Datenbanksystem gelesen. Der Zugriff erfolgt explizit über die Methoden von Blob bzw. Clob. Folgendes Beispiel zeigt, wie über eine Ergebnismenge auf die Daten einer BLOB-Spalte zugegriffen wird.ResultSet rs; ... // Abfragen des Blob Blob blob = rs.getBlob(2); InputStream in = blob.getBinaryStream(); // Hier Lesen der Daten vom Stream ...Aus Sicht des Java-API bieten Blob- und Clob-Typen zusätzlich mit der Methode length() die Möglichkeit, direkt die Datenmenge zu ermitteln, eine Funktion, die bei der Abfrage von LONG- und LONG RAW-Spalten nicht zur Verfügung steht. Außerdem ist der Zugriff auf die BLOB-Daten auch dann noch möglich, wenn das zugehörige Statement-Exemplar bereits geschlossen wurde.
Blob und Clob können außerdem bei PreparedStatement- und CallableStatement-Exemplaren als Eingabeparameter verwendet werden. Auf diese Weise kann man z. B. ein Bild, das bereits in der Datenbank als Blob existiert, relativ einfach in einem anderen Datensatz verwenden, wie folgendes Beispiel zeigt:import java.sql.*; import java.io.*; ... Connection con; Blob blob; // Hier Abfragen des BLOB ... // SQL-Anweisung initialisieren String sql = "UPDATE titel SET bild = ? WHERE tit_id = ?"; PreparedStatement prep = con.prepareStatement(sql); // Bilddaten als Blob setzen prep.setBlob(1, blob); // Titel-ID setzen prep.setLong(2, 1); prep.executeUpdate(); ...