19.2 Benutzerdefinierte
Datentypen
19.3 Benutzerdefinierte
Funktionen
Dieses Kapitel beschreibt die
Eigenschaften des Object
Management-Moduls von
INGRES. Nach der
Einführung und
Beschreibung von
Merkmalen dieser INGRES-Komponente
werden benutzerdefinierte Datentypen
und Funktionen sowie
Funktionsinstanzen beschrieben.
Ab Version 6.3 bietet INGRES
die sogenannte intelligente
Datenbank an, die aus drei Moduln
- Data Management,
- Object Management und
- Knowledge Management
besteht. Der
Data Management-Modul kennzeichnet das
Grundprodukt von
INGRES, der alle bis jetzt beschriebenen
Komponenten enthält.
Der Object Management-Modul ist,
genauso wie der Knowledge
Management-Modul, ein optionales
Produkt, der dem Benutzer
die Möglichkeit bietet,
eigene Datentypen und
Funktionen zu implementieren. Der
Knowledge Management-Modul schließlich dient der Erstellung
zusätzlicher Regeln. Der Object
Management-Modul wird in
diesem Kapitel, der Knowledge
Management-Modul im nächsten
Kapitel beschrieben.
Alle herkömmlichen Datenbanksysteme unterstützen nur die
einfachen Datentypen wie Zeichenketten, Zahlen usw.
Alle abstrakten Datentypen müssen
in den einzelnen
Anwendungsprogrammen implementiert werden. Diese
Vorgehensweise bringt einen großen Implementierungsaufwand
mit sich, weil die Programmierung
solcher Datentypen lange
dauert und, im
Falle von allgemein benutzten abstrakten
Datentypen (wie z.B. dem
Datentyp
"Arbeitstage", der nur
die Werktage berücksichtigt) in jedem einzelnen Projekt
von
neuem implementiert wird.
Ein weiterer Nachteil ist, daß alle Integritätsvorschriften,
die im Bezug auf einen
abstrakten Datentyp existieren,
im Anwendungsprogramm berücksichtigt werden müssen. Auch
die
Verarbeitungsgeschwindigkeit
einer Datenbankanwendung
wird dadurch
beeinträchtigt, daß für
die Bearbeitung
und
die Überprüfung von
Integritätsvorschriften abstrakter
Datentypen immer Zugriffe vom
Anwendungsprogramm auf den
Datenbank-Server notwendig sind.
INGRES bietet dem Benutzer,
mit Hilfe des
Object
Management-Moduls die
Möglichkeit, eigene abstrakte
Datentypen zu erstellen. Object
Management ermöglicht
auch die Manipulation der benutzerdefinierten Datentypen
mit Hilfe von benutzerdefinierten Funktionen und
Funktionsinstanzen. Alle
benutzerdefinierten Datentypen
werden nach der Erstellung fester Bestandteil von
INGRES-DBMS, so daß alle o.g.
Nachteile entfallen.
Weil die vom Benutzer geschriebenen Routinen, die abstrakte
Datentypen oder neue Funktionen definieren, als Teil des
INGRES-DBMS laufen, haben sie
dieselbe Bedeutung wie der
vom Hersteller implementierte Quell-Code. Deswegen ist es
wichtig, die Routinen sehr sorgfältig
zu implementieren
und
auszutesten, weil jeder
Fehler einem Fehler
in
der
INGRES-Software entspricht und
somit weitgehende
Konsequenzen für
die existierenden Datenbankanwendungen
haben kann.
Die
Routinen, mit denen
benutzerdefinierte Datentypen
und
Funktionen implementiert werden,
können in jeder
Programmiersprache der
dritten Generation implementiert
werden. Trotzdem ist es
empfehlenswert, sie in der Sprache
C
zu programmieren, weil die
von INGRES zur
Verfügung
gestellten Makro-Bibliotheken
in C geschrieben sind.
Die
Implementierung der Benutzerrutinen
in einer anderen Sprache
verlangt die genaue Einhaltung der Strukturen, die in
den
Makro-Bibliotheken existieren.
Jeder abstrakte Datentyp muß
zuerst vom Benutzer definiert
werden. Die Definition beinhaltet
- den Namen,
- die Länge und
- die
Identifikationsnummer
des
neuen Datentyps. Diese
drei Merkmale werden
in
den entsprechenden Datenfeldern der Struktur iiadd_dt_dfn
abgelegt. (iiadd_dt_dfn ist ein
Teil der Makro-Bibliothek
iiadd.h, die von INGRES zur
Verfügung gestellt wird.)
Der
Name des benutzerdefinierten
Datentyps darf maximal 24
Zeichen lang sein. Falls die Zeichenkette kürzer als
24
Zeichen ist, muß sie
mit dem Wert 0 abgeschlossen sein.
Die Identifikationsnummer muß eindeutig in Bezug auf alle
benutzerdefinierten Datentypen sein und
zwischen 16384 und
16511 liegen. Die maximale
Anzahl der benutzerdefinierten
Datentypen ist z.Z. auf 128
beschränkt.
Jeder benutzerdefinierte Datentyp
ist nur dem INGRES-DBMS
bekannt. Die
Benutzerschnittstellen von INGRES
(QBF,
RBF
usw.) wissen nichts
von der Existenz
dieser
Datentypen. Deswegen muß das
DBMS die Konvertierung jedes
benutzerdefinierten Datentyps für
die Benutzerschnittstellen
vornehmen. Diese Konvertierung erfolgt auf Grund der Werte,
mit denen der Benutzer die Funktion dbtoev
versorgt.
Nachdem der Datentypname und
die Identifikationsnummer
festgelgt sind, müssen die von
INGRES vorgegebenen Routinen,
die
die Manipulation des
benutzerdefinierten Datentyps
beschreiben, versorgt werden.
Jede Routine hat
folgende
Parameter
- scb (muß angegeben werden),
- arg1 (optional),
- arg2 (optional),
- ergebnis (muß
angegeben werden),
die folgende Bedeutung haben
Parameter |
Bedeutung |
scb |
eine Struktur ("Session Control Block"), die die Information für das INGRES
Datentyp-Subsystem liefert. |
arg1 /
arg2 |
zwei optionale Parameter, die als Zeiger
definiert sind und auf die Struktur ii_data_values zeigen. ii_data_values
beschreibt die von einer Routine benutzten Datenwerte. |
enthält
das Teilergebnis einer Funktion. |
Für
jeden benutzerdefinierten
Datentyp müssen folgende von
INGRES vorgegebenen Routinen
versorgt werden:
Compare hmax
dbtoev hmin
dhmax keybuild
dhmin length_check
getempty minmaxdv
hashprep tmcvt
helem
value_check
hg_dtln tmlen
Routine |
Funktion |
compare |
vergleicht zwei Datenelemente des
benutzerdefinierten Datentyps. Die beiden Argumente arg1 und arg2 zeigen auf die zu vergleichenden
Datenelemente. |
dbtoev |
legt den
INGRES-Datentyp fest, in den der benutzerdefinierte Datentyp
konvertiert wird. |
dhmax |
definiert den maximalen |
dhmin |
bzw. minimalen Standardwert, der vom
Optimierer für die Berechnung der optimalen Strategien verwendet wird. |
getempty |
definiert den Standardwert für den
benutzerdefinierten Datentyp (z.B.
ist der Standardwert für numerische Werte 0 und für alphanumerische Werte das
Leerzeichen). |
hashprep |
bereitet einen Datumswert zur Verwendung
als Hash-Schlüssel vor. |
helem |
erstellt eine (gewöhnlich verkürzte) Darstellung
für den Datumswert. Diese Darstellung wird vom Optimierer für die Erstellung
der optimalen Strategien verwendet. |
hg_dtln |
liefert den Namen und die Länge des als
Argument angegebenen Datentyps. |
hmax |
definiert den tatsächlich maximalen |
hmin |
bzw. minimalen Datenwert für den
benutzerdefinierten Datentyp. |
keybuild |
erstellt aus einem Datenwert den Schlüssel,
der bei der ISAM-, CISAM, BTREE- und CBTREE-Speicherstruktur für die direkte
Suche verwendet wird. |
length_check |
überprüft, ob die angegebene Länge des
Datentyps gültig ist. |
minmaxdv |
liefert den minimalen bzw. maximalen Wert
(oder Länge) des als Parameter angegebenen Datentyps. |
tmcvt |
konvertiert den angegebenen Datentyp in
eine druckbare Form. |
value_check |
überprüft die Gültigkeit der Datenwerte. |
liefert die Standard- und maximale Länge
eines Datentyps, für den Fall, daß er als Text gedruckt werden muß. |
Neben den benutzerdefinierten
Datentypen ist es mit Object
Management möglich, auch benutzerdefinierte
Funktionen zu
implementieren, die dem
INGRES-DBMS bekannt sind
und von
ihm
als herkömmliche Systemfunktionen behandelt werden.
Die
benutzerdefinierten Funktionen unterstützen sowohl alle
INGRES-Datentypen als auch benutzerdefinierte Datentypen als
Parameter.
Jede benutzerdefinierte
Funktion muß zuerst
definiert
werden. Ihre Definition beinhaltet
- den Funktionsnamen,
- die Identifikationsnummer und
- den Operationstyp.
Diese Merkmale werden in der
Struktur iiadd_fo_dfn abgelegt.
(iiadd_fo_dfn ist ein Teil
der Makro-Bibliothek iiadd.h, die
von INGRES zur Verfügung gestellt
wird.)
Die Struktur iiadd_fo_dfn hat
folgende Felder
Feldname |
Bedeutung |
fod_object_type |
enthält die Konstante II_O_OPERATION. |
fod_name |
stellt den Funktionsnamen dar. (Für den Funktionsnamen
gilt alles, was wir schon für den Datentypnamen gesagt haben.) |
fod_id |
enthält die Identifikationsnummer der
Funktion. Diese muß eindeutig in
Bezug auf alle benutzerdefinierten Funktionen und größer als 16384 sein. |
stellt den Operationstyp dar. |
Funktionsinstanzen definieren die Verwendung einer Funktion
bzw. eines
Operators (z.B. "+") in einem
konkreten Fall.
Die Existenz der
Funktionsinstanzen ist notwendig,
weil
dieselbe Funktion bzw. derselbe
Operator mit verschiedenen
benutzerdefinierten Datentypen
unterschiedliche Bedeutung
haben kann.
Die Definition der
Funktionsinstanzen beinhaltet:
- die Identifikationsnummer;
- den Komplementoperator;
- die Identifikationsnummer
der Funktion, die diesen
Operator verwendet;
- den Operationstyp;
- die Anzahl von Argumenten und ihren jeweiligen
Datentyp;
- den Datentyp des
Ergebnisses;
- die Länge des Ergebnisses;
- die Adresse der Routine, die die Funktionsinstanz
ausführt.
Die
Identifikationsnummer ist eine
2 Byte lange Ganzzahl,
die
eindeutig in Bezug auf alle Funktionsinstanzen und
größer als 16384 sein muß. Der
Komplementoperator einer
Funktionsinstanzen muß
angegeben werden, falls
es sich
beim Operator um einen
Vergleichsoperator handelt. (Z.B.
ist
das Komplement von
"=" (gleich) "!="
(ungleich)). Die
Definition eines Komplementoperators ist notwendig, um dem
Optimierer die Möglichkeit zu
geben, alternative Wege zur
Abarbeitung einer Abfrage mit Hilfe des Komplementoperators
durchzuführen. Der Operationstyp definiert die Eigenschaft
eines Operators.
Beispiel 19.1
Ein allgemein
verwendbarer abstrakter Datentyp
ist
"Arbeitstag". Bei diesem
Datentyp handelt es sich um alle
Wochentage, die
Werktage sind, also
Montag, Dienstag,
Mittwoch, Donnerstag und Freitag.
Für den Datentyp
"Arbeitstag" können z.B. als
Operatoren "+" (Addition) und
"-" (Subtraktion) definiert werden. Für den ersten Operator
kann die Funktion
"Addiere" und für den zweiten die Funktion
"Subtrahiere", mit
folgenden Ergebnissen definiert werden:
Addiere ("Montag" + 5) =
"Montag",
Subtrahiere
("Montag - 1) =
"Freitag".