3. Erweiterbarkeit von Datenbanksystemen Große Objekte Große Objekte (LOBs) Für große Objekte benötigt man geeignete Datentypen. Hierzu dienen die sogenannten Large Objects (LOBs). Üblicherweise unterscheidet man die folgenden Arten von LOBs: 1. Blob (Binary Large Object) Kann bis zu 2 GB binäre Daten enthalten. 2. Clob (Character Large Object) Kann bis zu 2 GB Zeichendaten (ein Byte) enthalten. Wie für Character-Daten üblich ist damit jeweils eine bestimmte Codierung verbunden. 3. Dbclob (Double-Byte Character Large Object) Character-LOB für die Aufnahme von Doppelbyte Character-Daten, z.B. Unicode. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 93 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Beispiel: create table studenten ( matrikelnummer Char(7), name Varchar(30), adresse Varchar(200), grad Varchar(30), photo Blob( 5M ) not logged compact, -- Bild abschlusstag Date, abschlussarbeit Clob( 500K ) not logged compact -- Text ); Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 94 3. Erweiterbarkeit von Datenbanksystemen Große Objekte LOBs unterscheiden sich durch die folgenden Punkte von gew öhnlichen Datentypen: 1. Die Daten von LOBs werden in separaten Speicherbereichen abgelegt. Innerhalb der Tabelle wird ein Deskriptor gespeichert, der zur Lokalisation des LOB dient. 2. LOBs können in Anwendungsprogrammen durch sogenannte Lokatoren manipuliert weden. Dies entspricht ungefähr einem Zeiger in den Speicherbereich für LOBs. 3. Mit Hilfe von Dateireferenzen können Daten direkt aus einer Datei in die Datenbank geladen werden (bzw. umgekehrt). 4. Attribute, die auf einem LOB-Datentyp basieren, können vom Logging ausgenommen werden. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 95 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Deklaration von LOB-Variablen in C bzw. C++: • Zur Angabe des Datentyps verwendet man innerhalb der Declare-Section “SQL TYPE IS” gefolgt vom Typ des LOBs inklusive der Größe: SQL TYPE IS Clob( 1M ) x; • Die so definierte Variable x ist dann eine Struktur mit zwei Komponenten: struct x_t { unsigned long length; char data[1048576]; } x; • Es dürfen C-Speicherklassen angegeben werden. Weiterhin sind Zeiger (*) und Referenzen (&) erlaubt. • Mit den Makros – SQL_BLOB_INIT, Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 96 3. Erweiterbarkeit von Datenbanksystemen Große Objekte – SQL_CLOB_INIT und – SQL_DBCLOB_INIT können LOB-Variablen geeignet initialisiert werden: EXEC SQL BEGIN DECLARE SECTION; static SQL TYPE IS Clob( 1M ) *p1, c1 = SQL_CLOB_INIT( "Hello" ); EXEC SQL END DECLARE SECTION; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 97 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Einschränkungen bei LOBs 1. Keine Verwendung in Prädikaten möglich, die direkte Vergleiche beinhalten. Verwendung bei LIKE ist erlaubt (als linker Operand). 2. Keine Verwendung in einem Kontext, der implizit Vergleiche erfordert, z.B.: SELECT DISTINCT, COUNT DISTINCT, MAX, MIN, GROUP BY, ORDER BY, PRIMARY KEY, FOREIGN KEY. 3. Keine Kombination durch Mengenoperatin möglich: INTERSECT, UNION, EXCEPT. 4. Keine Verwendung als Datums- oder Zeitangabe. 5. In der Regel keine Replikation möglich. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 98 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Lokatoren • Es ist ineffizient, große Objekte zwischen der Datenbank und einem Anwendungsprogramm zu übertragen. • Stattdessen ist es wünschenswert, – daß eigentliche Übertragen der Daten solange wie möglich hinauszuzögern und – nur die Daten zu übertragen, die gebraucht werden. • Wenn das Programm exakt angeben kann, welche Manipulationen durchgeführt werden sollen, dann ist unter Umständen überhaupt kein Transfer von Daten notwendig. • Ein Lokator ist ein Wert, der in einem Anwendungsprogramm zur Repr äsentation des Wertes eines LOBs verwendet werden kann, ohne die Daten des Objektes tatsächlich zu enthalten. • Ausführen von Operation auf den Objekten durch Manipulation der Lokatoren • Keine Allokation von Speicher für die Objekte Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 99 3. Erweiterbarkeit von Datenbanksystemen Große Objekte • Eine Lokatorvariable dient zur Aufnahme eines Lokators: EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS CLOB_LOCATOR loc1, loc2; EXEC SQL END DECLARE SECTION; • In C werden Lokatorvariablen durch den Datentyp long repr äsentiert (Übersetzung durch den Precompiler). • Lokatorvariablen können innerhalb einer SQL-Anweisung überall dort verwendet werden, wo auch eine Ein- oder Ausgabevariable eines LOB-Datentyps verwendet werden kann. • Mit Hilfe der Values-Anweisung können Werte für Lokatoren berechnet werden, ohne dabei eine Tabelle zu referenzieren. EXEC SQL VALUES substr( :loc1, posstr( :loc1, ’Rosebud’), 100 ) INTO :loc2; • Die mit einem Lokator verbundenen Ressourcen können frühzeitig freigegeben werden: EXEC SQL Free Locator :loc1, :loc2; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 100 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Verwendung von Lokatoren mit externen Funktionen Wie kann man Lokatoren in UDFs verwenden, denn die Values-Anweisung ist dort nicht erlaubt? 1. Der Datentyp für einen Lokator ist long bzw. udf_locator. 2. Lokatoren können sowohl für Eingabe- als auch als Ausgabeparameter verwendet werden. 3. sqludf_length bestimmt die Länge des von einem Lokator repräsentierten Wertes. 4. sqludf_substr holt einen Teilstring aus dem Lokator-Wert. 5. sqludf_create_locator erzeugt einen neuen Lokator, der initial ein leeres Objekt repräsentiert. 6. sqludf_append hängt Daten aus einem Puffer an das Ende eines Lokator-Wertes an. 7. sqludf_free_locator gibt die mit einem Lokator verbundenen Ressourcen frei. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 101 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Beispiel für die Deklaration einer UDF, die Lokatoren als Eingabeparameter und für das Resultat verwendet: CREATE FUNCTION kontextSuche( Varchar(100), Clob( 1M ) as Locator ) RETURNS Clob( 1M ) AS Locator ... NOT FENCED ... Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 102 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Dateireferenzen Wie bekommt man ein LOB in die Datenbank, ohne die Daten über die Applikation zu transferieren? ☞ Dateireferenzen (File References) • Eine Dateireferenz ist eine Struktur, die den Namen einer Datei sowie weitere Informationen über die Datei enthält. • Einen Dateireferenz-Variable ist eine Host-Variable die den Typ Dateireferenz hat. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 103 3. Erweiterbarkeit von Datenbanksystemen Große Objekte • Beispielhafte Deklaration einer Dateireferenz-Variablen: #include <sql.h> EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS CLOB_FILE f1; EXEC SQL END DECLARE SECTION; • Die so definierte Variable ist eine Struktur mit vier Komponenten: struct { unsigned long name_length; unsigned long data_length; unsigned long file_options; char name[255]; } f1; • Der Dateiname (relativ oder absolut) bezeichnet eine Datei auf dem ClientRechner. • Symbolische Konstanten und Bedeutung für file options: Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 104 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Konstante Bedeutung SQL FILE READ Dateiinhalt ist LOB-Eingabewert SQL FILE CREATE Datei wird für LOB-Ausgabewert erzeugt SQL FILE OVERWRITE Datei wird für LOB-Ausgabewert überschrieben SQL FILE APPEND Datei wird für LOB-Ausgabewert erweitert • Nach Deklarierung und Initialisierung einer LOB-Dateireferenz kann die Variable in einer SQL-Anweisung so benutzt werden, als würde es sich um eine LOB-Variable handeln. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 105 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Beispiel Ausgabe in Datei via Dateireferenz: EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_FILE germanyMap; short ind; EXEC SQL END DECLARE SECTION; strcpy( germanyMap.name, "germanyMap.jpg" ); germanyMap.name_length = strlen( germanyMap.name ); germanyMap.file_options = SQL_FILE_OVERWRITE; EXEC SQL SELECT wfb.maps INTO :germanyMap :ind FROM wfb.maps WHERE id = ’GM’; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 106 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Beispiel Eingabe von Datei via Dateireferenz: EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_FILE germanyMap; EXEC SQL END DECLARE SECTION; strcpy( germanyMap.name, "germanyMapAfterReunion.jpg" ); germanyMap.name_length = strlen( germanyMap.name ); germanyMap.file_options = SQL_FILE_READ; EXEC SQL UPDATE wfb.maps SET map = :germanyMap WHERE id = ’GM’; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 107 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Benutzerdefinierte Typen (UDTs) Beim Aufbau einer Datenbank entscheidet man sich häufig dafür, einen vordefinierten Datentyp in bestimmter Weise zu verwenden, z.B.: • Integer für Altersangaben • Decimal(8,2) für Geldbeträge • Double für Winkel Problem: ☞ Mit den vordefinierten Operationen ist u.U. keine sinnvolle Interpretation für die repräsentierten Werte verbunden. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 108 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Erzeugung einzigartiger Typen • ORDBS bieten die Möglichkeit, für eine spezialisierte Verwendung von Daten eigene Typen zu erzeugen, sogenannte einzigartige Typen (distinct types). • siehe auch SQL-99 (core level) • Jeder der einzigartigen Typen hat mit einem der vordefinierten Typen seine interne Darstellung gemeinsam. • Der vordefinierte Typ heißt in diesem Fall Quell- bzw. Basistyp. • Abgesehen von der internen Darstellung wird der einzigartige Typ als separater Datentyp betrachtet, der von allen anderen Typen verschieden ist. • In DB2 dient die Anweisung create distinct type zur Definition einzigartiger Typen. • SQL-99: create type Beispiel: Definition einzigartiger Typen: CREATE DISTINCT TYPE Geschlecht AS char(1) WITH COMPARISONS; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 109 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen CREATE DISTINCT TYPE Geld AS decimal(8,2) WITH COMPARISONS; CREATE DISTINCT TYPE Geometrie.Winkel AS Double WITH COMPARISONS; CREATE DISTINCT TYPE Song AS Blob(300M); Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 110 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Bemerkungen: • Eine Instanz eines einzigartigen Typs wird nur mit einer Instanz des desselben Typs als vergleichbar betrachtet. • Der Zusatz WITH COMPARISONS ist notwendig, wenn der Quelltyp kein LOB-Typ ist. • Für solche einzigartigen Typen stehen die üblichen Vergleichsoperatoren zur Verfügung. Die Definition der Vergleichsoperatoren ist identisch mit der des Basistyps. • Die Verwendung eines solchen einzigartigen Typs bei ORDER BY, GROUP BY und DISTINCT ist möglich. Auch können Indexe auf Basis solch eines Typs definiert werden. • Da für LOB-Typen keine Vergleiche unterstützt werden, l äßt man dort WITH COMPARISONS weg. • Hier auch kein ORDER BY, GROUP BY, DISTINCT und auch keine Indexe. • Der Name des einzigartigen Typs kann mit einem Schemanamen qualifiziert werden. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 111 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • Einzigartige Typen werden in der Tabelle DATATYPES des Systemkatalogs registriert. • Erstellung von Kommentaren zu einzigartigen Typen: COMMENT ON DISTINCT TYPE Geld IS ’Eurobetraege bis 1 Million EUR’; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 112 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Einen einzigartigen Typ kann man wie einen vordefinierten Typ bei der Definition einer Tabelle verwenden: CREATE TABLE angestellte ( angnr char(5), abtnr char(5), name varchar(30), geschlecht Geschlecht, gehalt Geld ); Mit der DROP-Anweisung werden einzigartigen Typen gelöscht: DROP DISTINCT TYPE Video; DROP DISTINCT TYPE Geometrie.Winkel; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 113 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Casting-Funktionen Bei Erzeugung eines einzigartigen Typs werden automatisch zwei Casting Funktionen angelegt: • Eine Funktion f : Basistyp −→ DistinctT ype Diese Funktion trägt den Namen des einzigartigen Typs. • Eine Funktion f −1 : DistinctT ype −→ Basistyp Diese Funktion trägt den Namen des Basistyp. Beispiel: Für den einzigartigen Typ CREATE DISTINCT TYPE alter IS integer; werden die Funktionen mit den folgenden Signaturen erzeugt: • alter( integer ) Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 114 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • integer( alter ) Konsequenz: Sind alter1 und alter2 vom Typ alter, dann gilt: • alter1 + alter2 ist nicht erlaubt, aber • alter( integer(alter1) + integer(alter2) ) ist erlaubt. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 115 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Bemerkungen: • Die Casting-Funktionen sind sehr effizient. • Ist mit dem einzigartigen Typ implizit durch den Basistyp eine L änge oder Genauigkeit verbunden, so wird dies bei der Umwandlung berücksichtigt. • Die Casting-Funktionen können entweder durch ihren Namen oder durch Anwendung eines CAST-Ausdruckes angesprochen werden. alter(14) CAST( 14 as alter) integer(alter1) CAST( alter1 as integer ) Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 116 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Zuweisung einzigartiger Typen Zuweisung heißt hier: • Eintragung eines neuen Wertes in eine Datenbanktabelle (Input): UPDATE, INSERT INTO • Übertragung eines Wertes von einer Datenbanktabelle in eine Wirtsvariable (Output): SELECT Für die vordefinierten Datentypen finden hier u.U. implizite Konvertierungen (Coercions) statt. Wie laufen Zuweisungen ab, wenn einzigartige Typen beteiligt sind? Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 117 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen 1. Zuweisung vordefinierter Typ T an einzigartigen Typ DT bei Input Nur möglich, falls: • T der Basistyp von DT ist oder • T in den Basistyp von DT gemäß der Konversionspfade konvertiert werden kann. Die Konversion findet implizit statt. 2. Zuweisung einzigartiger Typ DT an vordefinierten Typ T bei Input Nur möglich, falls T der Basistyp von DT ist (implizite Konversion). 3. Zuweisung einzigartiger Typ DT an vordefinierten Typ T bei Output Implizite Zuweisung in zwei Schritten: (a) Konversion DT in den Basistyp von DT (b) Konversion des Basistyps von DT nach T nach den üblichen Regeln (falls möglich). Beispiel: Es seien gegeben • CREATE DISTINCT TYPE Winkel AS double; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 118 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • Tabelle dreiecke mit einem Attribut ecke vom Typ Winkel • Hostvariable: double v; Sind die folgenden Zuweisungen zulässig? EXEC SQL SELECT ecke INTO :v FROM dreiecke WHERE farbe = ’rot’; EXEC SQL INSERT INTO dreiecke( farbe, ecke ) VALUES (’blau’, :v); UPDATE dreiecke SET ecke = 45.5 WHERE farbe = ’gruen’; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 119 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Quellenbasierte UDFs An einen einzigartigen Typ werden vom Basistyp nur die Vergleichsoperatoren (falls vorhanden) vererbt: • • • • siehe oben: alter1 + alter2 ist nicht erlaubt Muß man nun immer Casting verwenden? Nein! Man kann gezielt Semantik vom Basistyp auf den einzigartigen Typ übertragen. Dies erfolgt mit sogenannten quellenbasierten Funktionen. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 120 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • Eine quellenbasierte Funktion ist eine neue UDF, die auf einer bereits existierenden Funktion (Quellenfunktion) basiert. • Wird die quellenbasierte Funktion aufgerufen, dann werden 1. die Argumente des Aufrufs in die Parametertypen der Quellenfunktion konvertiert 2. die Quellenfunktion wird aufgerufen und 3. das Ergebis des Aufrufs wird in den Ergebnistyp der neuen UDF konvertiert. Quellenfunktion +( double, double ) 2. Ausführen der Quellenfuktion 1. Konvertieren der Argumente double 3. Konvertieren des Ergenisses der Quellenfunktion +(Gewicht, Gewicht) Gewicht quellenbasierte Funktion Ergebnis Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 121 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Deklaration einer quellenbasierten Funktion: • • • • erfolgt mit CREATE FUNKTION erlaubte bekannte Klauseln: RETURNS, SPECIFIC Neue Klausel: SOURCE In der SOURCE-Klausel wir die Quellenfunktion in einer der folgenden Varianten angegeben: – Funktionsname ohne Parameter – Spezifischer Name – Signatur Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 122 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Beispiele: CREATE DISTINCT TYPE Geld AS Decimal(8,2); CREATE FUNCTION "+"( Geld, Geld ) RETURNS Geld SOURCE "+"( Decimal(), Decimal() ); CREATE FUNCTION "-"( Geld, Geld ) RETURNS Geld SOURCE "-"( Decimal(), Decimal() ); CREATE FUNCTION "*"( Integer, Geld ) RETURNS Geld SOURCE "*"( Integer, Decimal() ); CREATE FUNCTION avg( Geld ) RETURNS Geld SOURCE avg( Decimal() ); CREATE DISTINCT TYPE Artikel AS Clob( 1M ); CREATE FUNCTION posstr( Artikel, Varchar() ) RETURNS Integer SOURCE posstr( Clob(), Varchar() ); Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 123 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen UDFs mit einzigartigen Typen • Man kann natürlich über ein reines Vererben von Funktionen des Basistyps an den einzigartigen Typ hinausgehen. • Hierzu verwenden wir natürlich externe UDFs. • Die Ausdruckskraft von einzigartigen Typen und externen UDFs wird am besten deutlich, wenn beides zusammen benutzt wird. Beispiel: Ein internationaler Konzern stellt Produkte in Deutschland und den USA her. Die Länge der amerikanischen Produkte wird in Fuß gemessen, die der deutschen in Meter. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 124 3. Erweiterbarkeit von Datenbanksystemen CREATE DISTINCT TYPE Fuss AS double WITH COMPARISONS; Einzigartige Typen CREATE DISTINCT TYPE Meter AS double WITH COMPARISONS; • Für die Produkte existieren jeweils separate Tabellen. CREATE TABLE us_produkte ( name varchar(20), groesse Fuss ); CREATE TABLE de_produkte ( name varchar(20), groesse Meter ); • Das System stellt Casting-Funktion zwischen den einzigartigen Typen und ihren Basistypen bereit. • Es liefert aber keine Konvertierung zwischen Fuss und Meter. Hierfür werden UDFs definiert. CREATE FUNCTION fuss( Meter ) RETURNS Fuss ... ; CREATE FUNCTION meter( Fuss ) RETURNS Meter ... ; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 125 3. Erweiterbarkeit von Datenbanksystemen void SQL_API_FN fuss ( double * meterIn, double * fussOut, ... ) { *fussOut = *meterIn * 3.28; ... } Einzigartige Typen void SQL_API_FN meter ( double * fussIn, double * meterOut, ... ) { *meterOut = *fussIn / 3.28; ... } • Der Konzern möchte zwei länderspezifische Kataloge herausgeben, • die aber alle Produkte enthalten. • Hierzu werden Views definiert. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 126 3. Erweiterbarkeit von Datenbanksystemen CREATE VIEW us_katalog( name, laenge, land ) AS SELECT name, laenge, ’US’ FROM us_produkte UNION ALL SELECT name, fuss(laenge), ’DE’ FROM de_produkte; Einzigartige Typen CREATE VIEW de_katalog( name, laenge, land ) AS SELECT name, laenge, ’DE’ FROM de_produkte UNION ALL SELECT name, meter(laenge), ’US’ FROM us_produkte; • Die Verkäufer können dann auf einfache Weise Abfragen auf den länderspezifischen Katalogen durchführen, • und sehen dabei alle Artikel in der gewohnten Weise. SELECT * FROM us_katalog WHERE laenge < fuss(5); SELECT * FROM de_katalog WHERE laenge < meter(3); Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 127 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Objektbasierte Repräsentation Vorteile von LOBs, UDFs und einzigartigen Typen zusammen: • LOBs ermöglichen es, in der Datenbank Objekte mit einer komplexen internen Repräsentation zu speichern. • UDFs erlauben es, diesen Objekten ein komplexes Verhalten zu geben. • Einzigartige Typen ermöglichen es, benutzerdefinierten Zustand und Verhalten zu einem Datentyp zusammenzufassen, der wie ein vordefinierter behandelt wird. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 128 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Beispiel: Datentyp für Polygone (x3,y3) Repräsentation des Polygons 5 x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 (x5,y5) (x4,y4) (x2,y2) (x1,y1) Grad (integer) plus n-mal zwei Koordinaten (double). Bytes: 4 + 16n Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 129 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Die Deklaration CREATE DISTINCT TYPE Polygon AS Blob( 16004 ); ermöglicht die Speicherung von Polygonen bis zum Grad 1000. Beispielhafte Konstruktoren: CREATE FUNCTION dreieck( double, double, double, double, double, double ) RETURNS Polygon ...; CREATE FUNCTION regulaeresNEck( integer, double, double, double ) RETURNS Polygon ...; CREATE FUNCTION makePolygon( integer, Clob( 16K ) ) RETURNS Polygon ...; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 130 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Beispielhafte Methoden bereitgestellt als UDFs: CREATE CREATE CREATE CREATE CREATE CREATE CREATE FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION grad( Polygon ) RETURNS integer ...; xkoordinate( integer, Polygon ) RETURNS double ...; ykoordinate( integer, Polygon ) RETURNS double ...; flaeche( Polygon ) RETURNS double ...; umfang( Polygon ) RETURNS double ...; rotiere( Polygon, double, double, double ) RETURNS Polygon ...; schneide( Polygon, Polygon ) RETURNS Polygon ...; Repräsentation des Polygons in C: struct Polygon { long degree; double coord[1]; /* eigentlich ein laenges Array */ }; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 131 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Ein Konstruktor in C: void SQL_API_FN dreieck( double * x1, ..., SQLUDF_BLOB * poly, /* OUT: Polygon im Blob */ ... ) { struct Polygon * p; p = (struct Polygon *)(poly->data); p->degree = 3; p->coord[0] = *x1; p->coord[1] = *y1; ... poly->length = sizeof(long) + 6 * sizeof(double); ... } Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 132 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Erzeugung einer Tabelle: CREATE TABLE grundstuecke ( parznr char(6), besitzer varchar(21), parzelle Polygon ); Einfügen von Datensätzen: INSERT INTO grundstuecke( parznr, besitzer, parzelle ) VALUES ( ’123456’, ’Josef Schmitz’, dreieck( 500, 600, 100, 1000, -300, 500 )); Anfrage: SELECT besitzer, umfang( parzelle ) FROM grundstuecke WHERE umfang( parzelle ) > 1000; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 133 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Fortsetzung ... Einige Erweiterungs- bzw. Programmiermöglichkeiten wurden noch nicht besprochen: • • • • Strukturierte Typen Implementierung von Stored Procedures Trigger, Constraints Indexerweiterungen Auf diese Punkte werden wir u.U. in den kommenden Kapiteln eingehen. Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 134