3. Erweiterbarkeit von Datenbanksystemen Ebenen der

Werbung
3. Erweiterbarkeit von Datenbanksystemen
Allgemeine Aspekte der Erweiterbarkeit
3. Erweiterbarkeit von Datenbanksystemen
3. Erweiterbarkeit von Datenbanksystemen
Allgemeine Aspekte der Erweiterbarkeit
Ebenen der Erweiterbarkeit
Neue Typen und Funktionen sollen auf jeder Ebene unterstützt werden k önnen:
• Kritik an traditionellen DB-Systemen: Armut an Datentypen und Funktionen
• Datenbankanwendungen verlangen in zunehmendem Maße nach der M öglichkeit
des Speicherns und Verarbeitens von Objekten, die
– sehr groß sind (Texte, Bilder, Videos) oder
– ein komplexes Verhalten haben (Komponenten im Entwurf).
• Die hierzu notwendigen Konzepte sind nicht im voraus absehbar und schwierig in
ein einheitliches Datenmodell integrierbar.
☞ Erweiterbare Datenbanksysteme bieten die Möglichkeit, spezifische zusätzliche
Datentypen mit zugehörigen Funktionen in ein DB-System zu integrieren.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
53
Allgemeine Aspekte der Erweiterbarkeit
•
•
•
•
Von der Bereitstellung neuer Typen auf der konzeptuellen Ebene
über die Integration zugehöriger Funktionen in SQL (externe Ebene)
über die Bereitstellung spezieller Speicherstrukturen
bis zur Optimierung von Zugriffen (interne Ebene).
Beispiel: Datentyp zur Repräsentation von Polygonen
• Auf der konzeptuellen Ebene muß der Datentyp definierbar sein, so daß er z.B. als
Attributstyp in einer Relation verwendbar ist.
• Funktionen bzw. Prädikate für Polygone (z.B. “Punkt liegt in Polygon”) müssen definierbar und in SQL integrierbar sein, so daß sie für Anfragen nutzbar sind.
• Spezielle Speicher- und Zugriffsstrukturen müssen die effiziente Auswertung einer
Funktion wie “Punkt liegt in Polygon” unterstützen.
☞ Die Erweiterbarkeit der internen Ebene ist der schwierigste Teil.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
55
Allgemeine Aspekte der Erweiterbarkeit
• Die traditionellen Vorteile relationaler Systeme sind nicht inkompatibel mit einem
reichhaltigen und erweiterbarem System von Datentypen und Funktionen.
• Objektrelationale Systeme kombinieren
– deklarative Anfragesprachen wie SQL und multiple Sichten auf die Daten mit
– der Fähigkeit, neue Datentypen und Funktionen zum Speichern und Manipulieren von Objekten zu definieren.
☞ In objektrelationalen DB-Systemen wird mehr von der Semantik der gespeicherten
Daten erfaßt.
Wir betrachten zunächst die Erweiterung auf konzeptioneller und externer Ebene:
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
54
☞ Benutzerdefinierte Funktionen
☞ Benutzerdefinierte Aggregatfunktionen
☞ Tabellenfunktionen
☞ Benutzerdefinierte Typen
Im nächsten Kapitel werden wir die Voraussetzungen für die Erweiterbarkeit auf der
internen Ebene kennenlernen.
56
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
Benutzerdefinierte Funktionen (UDF)
• die vom Benutzer erzeugt und
• unter Verwendung einer speziellen Anweisung (create function) in eine Datenbank integriert werden.
• Für die Programmierung von UDFs wird üblicherweise C eingesetzt.
• Die UDFs erweitern den Vorrat an SQL-Funktionen.
• Es kann sich hierbei um eine skalare Funktion, eine Aggregatsfunktion oder eine
Tabellenfunktion handeln.
3. Erweiterbarkeit von Datenbanksystemen
57
Benutzerdefinierte Funktionen
Integration von benutzerdefinierten Funktionen in eine DB:
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
59
Benutzerdefinierte Funktionen
void funcname( TYP1 * in1, TYP2 * in2, ... ,
/* IN, N-fach */
TYP * returnValue,
/* OUT */
short * ind1, short * ind2, ... , /* IN, N-fach */
short * null indicator,
/* OUT */
char * sqlstate,
/* OUT */
char * funcName,
/* IN */
char * specName,
/* IN */
char * message
/* OUT */
);
Funktions−API
Benutzerdef. Funkt.
dynamisches Binden
Dyn. Bibliothek
Compilierung/
Erzeugung dyn. Bibliothek
Create Function Anw.
2. Deklaration
Mit Hilfe einer create function Anweisung wird die UDF dem Datenbanksystem bekannt gemacht. Hierdurch steht eine entsprechende SQL-Funktion zur
Verfügung.
Bei erstmaliger Benutzung der UDF/SQL-Funktion wird die dynamische Bibliothek
an den DB-Kern gebunden und die betreffende C-Funktion aufgerufen.
In DB2 gelten folgende Konventionen für eine C-Funktion, die als Implementierung
einer skalaren UDF dienen soll:
Aufruf
Deklaration der
Funktion
1. Implementierung
Auf Basis eines standardisierten APIs wird eine C-Funktion erstellt, übersetzt und
in einer dynamischen Bibliothek (shared object) abgelegt.
UDF-Implementierung für skalare Funktionen
DBS−Kern
Built−In Funktionen
Benutzerdefinierte Funktionen
Die Integration besteht aus zwei Schritten:
Hierbei handelt es sich um Funktionen,
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
C Quelle
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
58
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
60
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
Erläuterungen zu den Parametern:
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
61
Benutzerdefinierte Funktionen
Zuordnung zwischen SQL- und C-Datentypen für UDFs (DB2):
SQL-Datentyp
Smallint
Integer
Decimal(p,s)
Real
Double
Char(n)
Varchar(n)
Date
Time
Timestamp
Blob(n), Clob(n)
Lokator für Blob, Clob
#include <sqlsystm.h>
void SQL_API_FN square( long * in, long * retval,
short * indicator, short * retind,
char * sqlstate, char * fnname,
char * specname, char * message )
{
*retval = *in * *in;
}
Erzeugung der dynamischen Bibliothek:
gcc -c -fpic -I/usr/IBMdb2/V7.1/include square.c
gcc -shared -o square.so square.o
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
63
Benutzerdefinierte Funktionen
PostgreSQL:
C-Datentyp
short
long
—
float
double
char[n+1], null-terminiert
char[n+1], null-termiert
char[11], null-terminiert, yyyy-mm-dd
char[9], null-terminiert, hh.mm.ss
char[27], null-terminiert, yyyy-mm-dd-hh.mm.ss.nnnnnn
struct { unsigned long length; char data[n]; }
unsigned long
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
Benutzerdefinierte Funktionen
Beispiel: UDF in DB2 zur Berechnung des Quadrats einer Zahl, siehe auch HomePage (Datei square.c).
1. Die ersten N Parameter der C-Funktion entsprechen den N Parametern der zugehörigen SQL-Funktion. Die Werte sind in entsprechende C-Typen konvertiert.
Es werden grundsätzlich Zeiger übergeben.
2. Zeiger auf den Rückgabewert
3. Indikatorvariablen für die N Eingabeparameter
4. Indikatorvariable für den Rückgabewert
5. char[6], null-terminiert, zur Rückgabe von SQLSTATE, ist initialisiert mit
"00000\0".
6. Voller qualifizierter Name der aufgerufenen SQL-Funktion. Dies macht es m öglich,
daß mehrere UDFs durch die gleiche C-Funktion implementiert werden.
7. spezifischer Name zur Unterscheidung bei der Überladung von Funktionsnamen;
macht es ebenfalls möglich, daß mehrere UDFs durch die gleiche C-Funktion implementiert werden.
8. char[70], null-terminiert zur Übergabe einer Fehlermeldung an die SQLCA (Feld
sqlerrmc).
3. Erweiterbarkeit von Datenbanksystemen
3. Erweiterbarkeit von Datenbanksystemen
#include <postgres.h>
#include <fmgr.h>
PG_FUNCTION_INFO_V1( square );
Datum square( PG_FUNCTION_ARGS )
{
int x = PG_GETARG_INT32( 0 );
int rc = x * x;
PG_RETURN_INT32( rc );
}
Erzeugung der dynamischen Bibliothek:
$ gcc -c -fpic -I/usr/local/src/postgresql-7.2.1/src/include/ square.c
$ gcc -shared -o square.so square.o
62
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
64
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
Deklaration der UDF square in DB2:
UDF-Deklaration (skalar)
Typischerweise werden die folgenden Dinge für eine skalare UDF in deren Deklaration
festgelegt:
create function square( double )
returns double
external name ’square.so!square’
deterministic
no external action
• Name und Signatur
• Typ des Rückgabewertes
• Externer Name, d.h. Pfad der dynamischen Bibliothek und Funktionsname
• Implementierungssprache
• Behandlung von Null-Werten
Ist das Ergebnis null falls einer der Parameter den Wert null hat?
• abgeschirmte Ausführung
Soll die Ausführung der Funktion im gleichen Adressraum wie der Datenbankprozess stattfinden?
not fenced
not null call
language c
no sql
parameter style db2sql
allow parallel;
--------------
Name und Signatur
Typ Rueckgabe
Externer Name
Resultat ist funktional
abhaengig von den Parametern
keine Interaktion
mit der Aussenwelt
keine abgeschirmte Ausfuehrung
kein Aufruf wenn Parameter null
verwendete Implementierungssprache
in DB2 obligatorisch
obligatorisch fuer UDFs in C
parallele Ausfuehrung moeglich
• deterministische Ausführung
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
65
Benutzerdefinierte Funktionen
Ist garantiert, ob die Funktion bei identischen Parameterwerten identische Ergebnisse liefert?
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
67
Benutzerdefinierte Funktionen
Deklaration der UDF square in PostgreSQL:
create function square( real )
returns real
as ’/home2/pbecke2m/postgres/square/square.so’, ’square’
language ’c’
with ( isstrict, iscachable );
• weitere Dinge sind DBS-spezifisch
Beispiel: Nutzung der UDF square:
SELECT id2, square( b_length )
FROM
wfb.countries
WHERE id1 = ’GM’
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
66
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
68
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
Ablauf der Funktionsresolution:
Funktionsresolution
1. Zunächst wird die Menge aller anwendbaren Funktionen bestimmt.
• Der Name der UDF kann ein Schema enthalten. Ebenso kann beim Aufruf ein
Schemaname angegeben werden (qualifizierter Funktionsname).
• Nachteile der Verwendung qualifizierter Funktionsnamen:
– lang, umständlich
– Anwendungen sollten nicht von einem speziellen Schema, in dem die Funktionen liegen, abhängig sein.
• Fehlt der Schemanamen, dann werden die Schemata des sogenannten Funktionspfades nach einer anwendbaren Funktionen durchsucht.
• Vorbelegung des Funktionspfades: SYSIBM, SYSFUN, USER
• Änderung: SET CURRENT FUNCTION PATH
• Eine Funktion ist auf einen gegebenen Aufruf anwendbar, falls:
– der Funktionsname mit dem im Aufruf genannten übereinstimmt und
– die Argumente des Aufrufs in die Parameter dieser Funktion propagierbar sind.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
69
Benutzerdefinierte Funktionen
• Propagierbar bedeutet, daß
– der Datentyp jedes Funktionsparameters entweder mit dem Datentyp des entsprechenden Aufrufsarguments übereinstimmt oder
– die Aufrufargumente entlang von Konversionspfaden in die Typen der Funktionsparameter umgewandelt werden können.
• Wichtige Konversionspfade:
– Smallint → Integer → Decimal → Real → Double
– Char → Varchar → Long → Varchar → Clob
• Die Datentypen Blob, Date, Time und Timestamp erfordern eine exakte Übereinstimmung.
• Länge, Genauigkeit sowie Anzahl von Nachkommastellen werden bei der Überprüfung der Anwendbarkeit ignoriert, für die Anwendung der Funktion findet aber
eine Konversion statt.
• Auf dem Funktionspfad können sich nun mehrere anwendbare Funktion befinden.
• Die Funktionsresolution sorgt für die Auswahl einer möglichst “guten” Funktion.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
70
2. Betrachte die Argumente des Aufrufs von links nach rechts. Für jedes Argument
werden die Funktionen eliminiert, die in bezug auf den Konversionspfad nicht die
“beste verfügbare” Übereinstimmung liefern.
3. Bleibt mehr als eine Funktion übrig, wird die Funktion aus dem Schema genommen, das zuerst im Funktionspfad auftritt.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
71
Benutzerdefinierte Funktionen
Beispiel und Übung zu UDFs
☞ Erweiterung einer Datenbank um Funktionen für approximatives String-Matching
(fuzzy matching)
Definition:
• Für zwei Strings x und y ist die Editierdistanz (Edit Distance) edit(x, y) definiert
als die kleinste Anzahl an Einfüge- und Löschoperationen, die notwendig sind, um
x in y zu überführen.
• Läßt man zusätzlich auch die Ersetzung eines Symbols zu, so spricht man von
einer Levenstein-Metrik (Levenshtein Distance) lev(x, y).
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
72
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
Beispiel: Für x = abcabba und y = cbabac gilt:
3. Erweiterbarkeit von Datenbanksystemen
Beispiel: Darstellung von LEV als Matrix für x = cbabac und y = abcabbbaa:
edit(x, y) = 5
abcabba −→ bcabba −→ cabba −→ cbba −→ cbaba −→ cbabac
c
b
a
b
a
c
lev(x, y) = 4
abcabba −→ cbcabba −→ cbabba −→ cbaba −→ cbabac
☞ Lösungsansatz zur Berechnung: dynamische Programmierung
☞ genauer: berechne die Distanz der Teilstrings x[1 . . . i] und y[1 . . . j] auf der Basis bereits berechneter Distanzen.
0
1
2
3
4
5
6
a
b
c
a
b
b
b
a
a
1
1
2
2
3
4
5
2
2
1
2
2
3
4
3
2
2
2
3
3
3
4
3
3
2
3
3
4
5
4
3
3
2
3
4
6
5
4
4
3
3
4
7
6
5
5
4
4
4
8
7
6
5
5
4
5
9
8
7
6
6
5
5
Die zugehörigen Umwandlungen lauten:
cbabac −→ ababac −→ abcabac −→ abcabbac −→ abcabbbac −→ abcabbbaa
Im folgenden sei m = |x| und n = |y| und es gelte m ≤ n.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Funktionen
73
Benutzerdefinierte Funktionen
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
75
Benutzerdefinierte Funktionen
Beachtenswerte Punkte bei UDFs
Die Tabelle LEV sei definiert durch:
LEV [i, j] := lev(x[1 . . . i], y[1 . . . j]) mit 0 ≤ i ≤ m, 0 ≤ j ≤ n
Die Werte für LEV [i, j] können mit Hilfe der folgenden Rekursionsformeln berechnet
werden:
• LEV [0, j] = j für 0 ≤ j ≤ n, LEV [i, 0] = i für 0 ≤ i ≤ m
• LEV [i, j] = min{ LEV [i − 1, j] + 1,
LEV [i, j − 1] + 1,
LEV [i − 1, j − 1] + δ(x[i], y[j])}

0 falls a = b
• δ(a, b) =
1 sonst
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
74
☞ Die UDF sollte reentrant sein, d.h. es sollten keine statischen Variablen benutzt
werden. So wird gewährleistet, daß die UDF gleichzeitig von verschiedenen Applikationen benutzt werden kann.
☞ Falls die UDF dynamisch Speicher allokiert, sollte dieser vor dem Ausstieg freigegeben werden. Ausnahme: Scratchpad-Funktionen, später mehr
☞ Niemals exit() für die Beendigung der UDF verwenden!
☞ Auch kein printf() oder scanf()!
☞ Für Implementierungen in C++ extern "C" als Teil der Funktionsdeklaration angeben.
☞ Beim Debugging einer UDF kann eine Datei auf dem Server für die Protokollierung
verwendet werden.
Hierbei muß auf die Zugriffsrechte geachtet werden, denn der Server-Prozeß l äuft
nicht unter der eigenen Benutzerkennung.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
76
3. Erweiterbarkeit von Datenbanksystemen
Tabellenfunktionen
Tabellenfunktionen
• Beispiel: Die UDF passwd() sei eine Tabellenfunktion, die Informationen über die
Benutzer eines Rechnersystems bereitstellt (siehe /etc/passwd).
Informationen über den DB2-Instance Benutzer könnten dann mit der folgenden
SQL-Anfrage ermittelt werden:
Tabellenfunktionen
• Eine Tabellenfunktion ist eine UDF, die eine Tabelle statt eines skalaren Wertes als
Ergebnis liefert.
• Tabellenfunktionen dienen dazu, Daten, die ausserhalb der Datenbank liegen, in
relationaler Form zur Verfügung zu stellen.
• Durch die Bereitstellung einer Tabellenfunktionen können solche Daten mit Daten
innerhalb einer Datenbank verknüpft und mittels SQL analysiert werden.
• Damit läßt sich die Ausdruckskraft von SQL auf Daten aus ganz unterschiedlichen
Quellen anwenden.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
3. Erweiterbarkeit von Datenbanksystemen
77
Tabellenfunktionen
SELECT *
FROM TABLE( passwd() ) AS passwd
WHERE name = ’db2inst1’
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
79
Tabellenfunktionen
Deklaration von Tabellenfunktionen
Nutzung von Tabellenfunktionen in SQL:
• Tabellenfunktion werden in der FROM-Klausel einer SQL-Anfrage verwendet.
• Die Syntax lautet:
Zur Deklaration einer Tabellenfunktion wird eine create function-Anweisung benutzt,
die sich aber in den folgenden Punkten zu der Deklaration von skalaren Funktionen
unterscheidet:
FROM TABLE( tabfunktion( para1, ... ) ) AS tabellenname
• Damit wird durch tabellenname die Ergebnisrelation des Aufrufs der Tabellenfunktion tabfunktion mit den angegebenen Parametern referenziert.
1. Die RETURNS-Klausel enthält das Schlüsselwort TABLE gefolgt von der Definition für
eine Tabelle analog zu create table.
2. Die FINAL CALL-Klausel ist obligatorisch. Diese Klausel sorgt dafür, daß ein zus ätzlicher Parameter, der sogenannte Call-Indicator, an die Implementierung übergeben wird, der zur Steuerung des Cursor-Konzeptes dient.
3. Die Option SCRATCHPAD sorgt dafür, daß die Funktion mit einem Bereich im Speicher versehen wird, über den Informationen von einem Funktionsaufruf zum
nächsten erhalten werden können.
Ein Zeiger auf diesen Bereich wird als zusätzlicher Parameter an die C-Funktion
übergeben.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
78
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
80
3. Erweiterbarkeit von Datenbanksystemen
Tabellenfunktionen
4. Die Angabe von DISALLOW PARALLEL ist obligatorisch, da Tabellenfunktionen immer
auf einem einzelnen Knoten ausgewertet werden.
5. Die Bedeutung von NOT NULL CALL ist, daß eine leere Tabelle als Resultat unterstellt wird, wenn einer der Parameter ein Null-Wert ist.
3. Erweiterbarkeit von Datenbanksystemen
Tabellenfunktionen
scratchpad
final call
disallow parallel
cardinality 50;
6. Mit der CARDINALITY-Klausel kann eine Schätzung für die Größe der Ergebnistabelle angegeben werden. Dies ist für den Optimierer von Bedeutung.
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
81
Tabellenfunktionen
3. Erweiterbarkeit von Datenbanksystemen
83
Tabellenfunktionen
Implementierung von Tabellenfunktionen
Beispiel: Deklaration für die Tabellenfunktion passwd():
Im Vergleich zur Implementierung von skalaren Funktionen gibt es die folgenden Unterschiede:
create function passwd()
returns table ( name
varchar(8),
passwd varchar(13),
uid
integer,
gid
integer,
gecos
varchar(50),
dir
varchar(128),
shell
varchar(50) )
external name
’/home/pb/vorlesungen/database/db2/passwd/passwd.so!password’
deterministic
no external action
language c
fenced
parameter style db2sql
no sql
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
1. Ein einzelner Aufruf der C-Funktion zu einer Tabellenfunktion liefert ein Tupel der
Ergebnisrelation. Zur Berechnung der Ergebnisrelation wird die C-Funktion mehrmals analog zum Cursor-Konzept aufgerufen.
2. Der sogenannte Call-Indicator gibt die zugehörige Cursor-Operation (OPEN,
FETCH, CLOSE) beim Aufruf der C-Funktion an.
3. Mit Hilfe des Scratchpads können Informationen von einem Aufruf der Funktion
zum nächsten Aufruf verwahrt werden. Die Daten im Scratchpad bleiben für die
Dauer der Ausführung einer SQL-Anweisung erhalten.
Das Scratchpad ist ein 100 Byte
großer Bereich.
82
struct sqludf_scratchpad
{
unsigned long length;
char
data[100];
};
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
84
3. Erweiterbarkeit von Datenbanksystemen
Tabellenfunktionen
Reicht dies nicht aus, kann man dynamisch Speicher allokieren und einen Zeiger
auf den allokierten Speicher im Scratchpad verwahren.
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Aggregatfunktionen
Benutzerdefinierte Aggregatfunktionen
4. Die C-Funktion liefert statt eines einzelnen Wertes pro Aufruf ein ganzes Tupel der
Ergebnisrelation. Dementsprechend ändern sich die Parameterkonventionen.
5. Das Ende der Ergebnisrelation wird von der C-Funktion durch den Wert 02000 für
SQLSTATE angezeigt.
Werte des Call-Indicators:
• Aggregatfunktionen (oder Spaltenfunktionen) bilden die Werte einer Spalte einer
Ergebnistabelle auf einen singulären Wert ab.
• Bekannte Aggregatfunktionen sind die SQL-Funktionen SUM, MIN, MAX, COUNT.
• Möchte man Funktionen für eine selbst definierte Zusammenfassung von Werte
implementieren, braucht man geeignete Konzepte der Erweiterung.
• SQL TF OPEN: Vorbereitende Aktionen, Öffnen von Dateien, Allokation von Speicher, Initialisierung des Scratchpads
• SQL_TF_FETCH: Rückgabe eines Tupels der Ergebnistabelle (SQLSTATE 00000),
oder Anzeige des Endes der Ergebnisrelation (SQLSTATE 02000), Update des
Scratchpads
• SQL_TF_CLOSE: Aufräumaktionen, Schließen von Dateien, Freigabe von Speicher
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
85
Tabellenfunktionen
Parameterkonventionen:
void funcname( input SQL parameters,
return column parameters,
input null indicators,
return null indicators,
SQLSTATE,
SQL function name,
specific name,
error message,
scratchpad,
final call indicator
);
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
87
Benutzerdefinierte Aggregatfunktionen
Eine Aggregatfunktion ist gekennzeichnet durch:
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
IN */
OUT */
IN */
OUT */
OUT */
IN */
IN */
OUT */
IN */
IN */
1. Basisdatentypen: Dies sind die Datentypen T1 , . . . , Tn der zu verarbeitenden
Werte.
2. Datentyp der Zustandsvariablen: Die Zustandsvariable ist vom Typ S .
3. Initialwert: Startwert für die Zustandsvariable s ∈ S .
4. Zustands übergangsfunktion: Funktion δ : S ×T1 ×. . . Tn −→ S . Sie bildet den
aktuellen Wert der Zustandsvariable sowie die Parameterwerte auf einen neuen
Wert für s ab.
5. Ergebnistyp: Typ A des Aggregationsergebnisses
6. Finalfunktion: Eine Funktion ω : S −→ A, die nach dem letzten Zustandsübergang aufgerufen wird und s auf das Ergebnis der Aggregation abbildet.
Beispiel: Tabellenfunktion passwd() ✎
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
86
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
88
3. Erweiterbarkeit von Datenbanksystemen
Benutzerdefinierte Aggregatfunktionen
•
•
•
•
n = 1, T1 = S = A = double
s=0
δ(s, p) := s + p2
√
ω(s) := s
Benutzerdefinierte Aggregatfunktionen
• Die Angabe eines Startwertes für s mittels initcond ist ebenfalls optional.
Beispiele:
Eine Aggregatfunktion zur Berechnung
der euklidischen Norm einer Spalte wäre
definiert durch:
3. Erweiterbarkeit von Datenbanksystemen
Das Skalarprodukt für zwei Spalten wäre
gegeben durch:
•
•
•
•
n = 2, T1 = T2 = S = A = double
s=0
δ(s, p1, p2) := s + p1 · p2
ω(s) := s
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
89
Benutzerdefinierte Aggregatfunktionen
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
3. Erweiterbarkeit von Datenbanksystemen
91
Benutzerdefinierte Aggregatfunktionen
Definition einer Aggregatfunktion in PostgreSQL:
Aggregatfunktionen in DB2:
CREATE AGGREGATE name (
sfunc = Funktionsname ,
basetype = Datentyp ,
stype = Datentyp ,
finalfunc = Funktionsname ,
initcond = ’Initialwert ’
)
• Aggregatfunktionen sind zunächst übliche mit create funtion deklarierte UDFs.
• Dies hat gegenüber PostgreSQL den Vorteil, daß die Aggregatfunktion mehr als
einen Paramter haben kann.
• Da mittels der Option SCRATCHPAD Informationen von einem Funktionsaufruf zum
nächsten erhalten werden können, kann somit s auf dem Scratchpad repräsentiert
werden.
Die Implementierung von δ entspricht der Logik zum Update des Scratchpads.
• Durch Auswertung des FINAL CALL Parameters kann s geeignet initialisiert werden.
• Problematisch ist die Implementierung von ω . Diese kann nicht innerhalb der UDF
erfolgen.
Stattdessen muß die UDF in eine geeignete vordefinierte Aggregatfunktion beim
Aufruf gekapselt werden.
Unter Umständen gibt es solche eine geeignete Aggregatfunktion aber nicht.
Bemerkungen:
• Die Aggregation kann sich nur auf eine Spalte beziehen, d.h. es gilt immer n = 1.
• basetype gibt den Basisdatentyp und den Ergebnistyp an, d.h. es gilt immer T 1 =
A.
• stype ist der Typ der Zustandsvariablen.
• sfunc bezeichnet eine UDF als Zustandsübergangsfunktion δ .
• finalfunc bezeichnet eine UDF als Finalfunktion ω (optional).
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
90
Datenbanksysteme: Weiterf ¨uhrende Konzepte — FH Bonn-Rhein-Sieg, WS 05/06
92
Herunterladen