3. Erweiterbarkeit von Datenbanksystemen Große Objekte 3. Erweiterbarkeit von Datenbanksystemen Große Objekte LOBs unterscheiden sich durch die folgenden Punkte von gew öhnlichen Datentypen: 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. 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). 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. 4. Attribute, die auf einem LOB-Datentyp basieren, können vom Logging ausgenommen werden. 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 3. Erweiterbarkeit von Datenbanksystemen 93 Große Objekte Beispiel: Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 95 Große Objekte Deklaration von LOB-Variablen in C bzw. C++: 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 ); • 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 94 Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 96 3. Erweiterbarkeit von Datenbanksystemen Große Objekte 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Lokatoren – SQL_CLOB_INIT und – SQL_DBCLOB_INIT können LOB-Variablen geeignet initialisiert werden: • Es ist ineffizient, große Objekte zwischen der Datenbank und einem Anwendungsprogramm zu übertragen. EXEC SQL BEGIN DECLARE SECTION; static SQL TYPE IS Clob( 1M ) *p1, c1 = SQL_CLOB_INIT( "Hello" ); EXEC SQL END DECLARE SECTION; • 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 3. Erweiterbarkeit von Datenbanksystemen 97 Große Objekte Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 99 Große Objekte • Eine Lokatorvariable dient zur Aufnahme eines Lokators: 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. 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 98 Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 100 3. Erweiterbarkeit von Datenbanksystemen Große Objekte 3. Erweiterbarkeit von Datenbanksystemen Große Objekte Verwendung von Lokatoren mit externen Funktionen Dateireferenzen Wie kann man Lokatoren in UDFs verwenden, denn die Values-Anweisung ist dort nicht erlaubt? Wie bekommt man ein LOB in die Datenbank, ohne die Daten über die Applikation zu transferieren? 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. ☞ Dateireferenzen (File References) Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 101 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 ... • 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 3. Erweiterbarkeit von Datenbanksystemen 103 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 102 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 Datei wird für LOB-Ausgabewert erzeugt SQL FILE CREATE SQL FILE OVERWRITE Datei wird für LOB-Ausgabewert überschrieben Datei wird für LOB-Ausgabewert erweitert SQL FILE APPEND • 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. 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 3. Erweiterbarkeit von Datenbanksystemen 105 Große Objekte Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 107 Einzigartige Typen Benutzerdefinierte Typen (UDTs) Beispiel Ausgabe in Datei via Dateireferenz: EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_FILE germanyMap; short ind; EXEC SQL END DECLARE SECTION; Beim Aufbau einer Datenbank entscheidet man sich häufig dafür, einen vordefinierten Datentyp in bestimmter Weise zu verwenden, z.B.: strcpy( germanyMap.name, "germanyMap.jpg" ); germanyMap.name_length = strlen( germanyMap.name ); germanyMap.file_options = SQL_FILE_OVERWRITE; • Integer für Altersangaben • Decimal(8,2) für Geldbeträge • Double für Winkel EXEC SQL SELECT wfb.maps INTO :germanyMap :ind FROM wfb.maps WHERE id = ’GM’; 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 106 Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 108 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Einzigartige Typen Bemerkungen: 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 • 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. Beispiel: Definition einzigartiger Typen: • Der Name des einzigartigen Typs kann mit einem Schemanamen qualifiziert werden. CREATE DISTINCT TYPE Geschlecht AS char(1) WITH COMPARISONS; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 3. Erweiterbarkeit von Datenbanksystemen 109 Einzigartige Typen Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 111 Einzigartige Typen • Einzigartige Typen werden in der Tabelle DATATYPES des Systemkatalogs registriert. • Erstellung von Kommentaren zu einzigartigen Typen: CREATE DISTINCT TYPE Geld AS decimal(8,2) WITH COMPARISONS; CREATE DISTINCT TYPE Geometrie.Winkel AS Double WITH COMPARISONS; COMMENT ON DISTINCT TYPE Geld IS ’Eurobetraege bis 1 Million EUR’; CREATE DISTINCT TYPE Song AS Blob(300M); Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 110 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: 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • integer( alter ) Konsequenz: Sind alter1 und alter2 vom Typ alter, dann gilt: CREATE TABLE angestellte ( angnr char(5), abtnr char(5), name varchar(30), geschlecht Geschlecht, gehalt Geld ); • alter1 + alter2 ist nicht erlaubt, aber • alter( integer(alter1) + integer(alter2) ) ist erlaubt. 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 3. Erweiterbarkeit von Datenbanksystemen 113 Einzigartige Typen Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 115 Einzigartige Typen Bemerkungen: 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. • 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 ) 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 Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 116 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen • Tabelle dreiecke mit einem Attribut ecke vom Typ Winkel • Hostvariable: double v; Zuweisung einzigartiger Typen Sind die folgenden Zuweisungen zulässig? 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 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’; 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 3. Erweiterbarkeit von Datenbanksystemen 117 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). Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 119 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. Beispiel: Es seien gegeben • CREATE DISTINCT TYPE Winkel AS double; Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 118 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 Gewicht quellenbasierte Funktion Ergebnis Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 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 DISTINCT TYPE Artikel AS Clob( 1M ); CREATE FUNCTION posstr( Artikel, Varchar() ) RETURNS Integer SOURCE posstr( Clob(), Varchar() ); 121 Einzigartige Typen Deklaration einer quellenbasierten Funktion: • • • • Einzigartige Typen CREATE FUNCTION avg( Geld ) RETURNS Geld SOURCE avg( Decimal() ); 3. Konvertieren des Ergenisses der Quellenfunktion +(Gewicht, Gewicht) 3. Erweiterbarkeit von Datenbanksystemen Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen 123 Einzigartige Typen UDFs mit einzigartigen Typen 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 • 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 122 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; 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; • 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 3. Erweiterbarkeit von Datenbanksystemen void SQL_API_FN fuss ( double * meterIn, double * fussOut, ... ) { *fussOut = *meterIn * 3.28; ... } 125 Einzigartige Typen void SQL_API_FN meter ( double * fussIn, double * meterOut, ... ) { *meterOut = *fussIn / 3.28; ... } 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 3. Erweiterbarkeit von Datenbanksystemen 127 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. • 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 3. Erweiterbarkeit von Datenbanksystemen 126 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) 3. Erweiterbarkeit von Datenbanksystemen Einzigartige Typen Beispielhafte Methoden bereitgestellt als UDFs: Repräsentation des Polygons 5 CREATE CREATE CREATE CREATE CREATE CREATE CREATE x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 (x5,y5) (x4,y4) 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 */ }; (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 3. Erweiterbarkeit von Datenbanksystemen 129 Einzigartige Typen Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06 3. Erweiterbarkeit von Datenbanksystemen Die Deklaration Ein Konstruktor in C: CREATE DISTINCT TYPE Polygon AS Blob( 16004 ); void SQL_API_FN dreieck( double * x1, ..., SQLUDF_BLOB * poly, /* OUT: Polygon im Blob */ ... ) { struct Polygon * p; ermöglicht die Speicherung von Polygonen bis zum Grad 1000. Beispielhafte Konstruktoren: CREATE FUNCTION dreieck( double, double, double, double, double, double ) RETURNS Polygon ...; Einzigartige Typen p = (struct Polygon *)(poly->data); p->degree = 3; p->coord[0] = *x1; p->coord[1] = *y1; ... poly->length = sizeof(long) + 6 * sizeof(double); ... 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 131 } 130 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 3. Erweiterbarkeit von Datenbanksystemen 133 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