LOB: Text Bild Röntgenbild Video Long Objects / Large Objects ca. 30 – 40 KB / Seite ca. 30 – 3000 KB ca. 40 – 60 MB ca. 1 – 3 GB / h BLOB = binary long object CLOB = character long object NCLOB = national character long object (z.B. deutsche Texte mit Umlauten) DBMS Informix MS SQL Server Oracle SQL Anywhere Sybase Adaptive Server BLOB CLOB BYTE TEXT IMAGE TEXT LONG RAW LONG IMAGE TEXT IMAGE TEXT (max. Datenlänge stets 2 GB) direkt von der DB verwaltet max. Größe kann bei Spaltendefinition explizit angegeben werden: K, M oder G Speicherung: − entweder innerhalb der DB in speziellen Speicherbereichen Nachteil: leistungsmindernd, da derart große Objekte bei der Bearbeitung anderer Objekte stören können: belegen viele Speicherseiten − oder in zusätzlichen (DB-)Dateien Nachteil: Lesen und Schreiben über zusätzliche Funktionen mit engen Beschränkungen CREATE TABLE buecher (isbn CHAR(13), titel CHAR(100), inhaltsverzeichnis CLOB(20K), buch_datei NCLOB(20M) COLLATE mein_satz, begleit_film BLOB(2G)); Sortierfolgetabelle nicht erlaubt sind: − Vergleiche mit < oder > − DISTINCT − UNIQUE-Integritätsregeln − GROUP BY und ORDER BY − UNION, EXCEPT und INTERSECT − Verwendung als Join-Spalte LOB-Funktionen: − CAST-Operator − Zuweisung − Vergleich − Verkettung − skalare Funktionen (nachfolgend nur BLOB erwähnt, aber gültig für alle LOB-Typen) CAST-Operator: Æ integer skalarer Wert Æ Æ BLOB BLOB explizite Datentypänderung, z.B: skalarer Wert BLOB CLOB falls Ziellänge >= Quelllänge: identisch, sonst abgeschnitten und Warnung (01004 in SQLSTATE) Æ benutzerdefinierter Datentyp dazu muss eine benutzerdefinierte Umwandlungsfunktion existieren, deren Parameter dem Quelltyp entspricht CAST (12345 as BLOB) Zuweisung: zwischen BLOB und binärer Zeichenkette − Zuweisung stets byteweise v.l.n.r. − Ziellänge wird angepasst an Länge der Quelle bis zur max. zulässigen Länge; ggf. verkürzte Übertragung und Warnung − falls Quelle NULL ist, bleibt Ziel unverändert Vergleich: − byteweise v.l.n.r. − nur = und <> Verkettung: − wie bei Zeichenketten − mit | | skalare Funktionen: SUBSTRING OVERLAY TRIM POSITION LENGTH NULLIF liefern BLOB-Objekt liefern integer-Wert liefert BLOB-Objekt oder NULL SUBSTR(begleit_film, 1, 1000) − liefert die ersten 1000 Oktets OVERLAY(begleit_film, zusatz, 1, 800) − überschreibt die ersten 800 Oktets − wenn Länge nicht angegeben: Länge des 2. Operanden POSITION(begleit_film, zusatz) − liefert Position, wo zusatz in begleit_film auftritt − liefert 0, wenn nicht enthalten LENGTH(begleit_film) − wird als generische Funktion verwendet: BIT_LENGTH Anzahl der Bits CHAR_LENGTH Anzahl der Oktets OKTET_LENGTH NULLIF(begleit_film, zusatz) − Operanden sind identisch: NULL − Operanden sind nicht identisch: 1. Operand LOBs und Anwendungsprogramme: mögliche Probleme mit Host-Variablen: − enormer Platzbedarf − der vorhandene zusammenhängende Speicher ist zu klein als Puffer − ein LOB muss ggf. mehrmals (nacheinander) bereitgestellt werden, da immer wieder verschiedene Teile daraus benötigt werden ESQL/C und SQLJ benutzen deshalb sog. Lokator anstelle einer Host-Variablen 4-Byte-Wert in einer Host-Variablen EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS CLOB AS LOCATOR inhalts_locator SQL TYPE IS BLOB AS LOCATOR film_locator; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT inhaltsverzeichnis, begleit_film INTO :inhalts_locator, :film_locator FROM buecher WHERE isbn = '3-8273-1889-0' 3 Lokator-Arten: BLOB-, CLOB- und NCLOB-Lokatoren explizite Verbindungsauflösung: FREE LOCATOR :name implizite Verbindungsauflösung: bei Transaktionsende d.h. Gültigkeitsbereich eines Lokators ist auf eine TA begrenzt HOLD LOCATOR :name hält den Wert des Lokators über die TA-Grenze hinweg (falls TA erfolgreich beendet wurde) . . . EXEC SQL SELECT inhaltsverzeichnis, begleit_film INTO :inhalts_locator, :film_locator FROM buecher WHERE isbn = '3-8273-1889-0' HOLD LOCATOR :film_locator; . . . EXEC SQL COMMIT; . . . EXEC SQL INSERT INTO buecher VALUES( ..., :film_locator);