Aggregatfunktionen, Lokatoren, Dateireferenzen, LOBs, einzigartige

Werbung
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
Herunterladen