Große Objekte (LOBs)

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