Kapitel 4

Werbung
Kapitel 4
Objektorientierung und Datenbanken
- Objektrelationaler SQL’99-Standard Dieser Teil der Unterlagen wurde weitgehend
unverändert übernommen von Dr. Can Türker,
ETH Zürich.
Herzlichen Dank für die Überlassung!
Überblick

Motivation

„Klassische SQL-Tabellen“

Erweiterungen des Datenmodells in SQL 1999
–
–
–

neue (Basis-) Datentypen
neue Typkonstruktoren
Objekttypen
… und daraus resultierende Erweiterungen bei den Operationen
4-2
“Advanced applications need advanced data structures!”

Ziel: 1 Anwendungsobjekt in 1 Datenbankobjekt abbilden
“Real
World”
!!!
DBMS
4-3
Beispiel: RDBMS in technischen Anwendungen
Robot
Effector
Rob_ID
Rob_Descr
Eff_ID
Function
Rob1
Rob2
Rob3
:
Speedy 400 ...............
Speedy 600 ...............
Colossus MX-3 .........
:
GR600
GR700
LS1
PS1350
Greifer Typ 600 ..............................
Greifer Typ 700 ..............................
Laserschweißer Typ 1 ....................
Punktschweißer Typ 1350 ..............
PS1380
PS1510
SR200
Punktschweißer Typ 1380 ..............
Punktschweißer Typ 1510 ..............
Schrauber Typ 200 .........................
Axes
has
(1,n)
Robot
(0,n)
can work
with
Rob_I
D
Arm_I
D
Rob1
Rob1
Rob1
:
links
links
links
:
AchsNr
Robot_Arms
GW_min
GW_max
-90
-170
-190
:
90
180
180
1
2
3
:
Masse
:
Beschl
40,0
30,5
20,0
:
1,0
1,5
3,0
:
(0,n)
(1,1)
ArmID
Rob1
Rob1
Rob2
Rob3
links
rechts
solo
links
Rob3
Rob3
mitte
rechts
Effector
Arms
Matrices
(1,n)
consist
of
(1,1)
Axes
Rob_ID
(4,4)
degrees
of
freedom
(1,1)
matrix rows
Rob_ID
Arm_ID
Rob1
Rob1
Rob1
Rob1
Rob1
:
Rob1
links
links
links
links
links
:
links
CanWorkWith
AchsNr
ZNr
Sp1
1
1
1
1
2
:
3
1
2
3
4
1
:
4
1
0
0
0
0
:
0
Sp2
0
0
-1
0
0
:
-1
Sp3
Sp4
0
1
0
1
0
:
0
1
0
80
1
60
:
70
Rob_ID
Eff_ID
Rob1
Rob1
Rob1
Rob1
:
Rob2
Rob2
SR200
SR300
PS1380
GR700
:
SR200
SR300
4-4
Beispiel: SQL Query
SELECT r.Rob_ID, r.Rob_Descr,
ar.Arm_ID, ac.AxisNo,
m.ZNo, m.Sp1, m.Sp2, m.Sp3, m.Sp4,
ac.GW_min, ac.GW_max, ac.Mass, ac.Accel,
re.Eff_ID, e.Function
FROM Robot r, Robot_Arms ar,
Axes ac, Matrices m,
CanWorkWith re, Effectors e
WHERE
r.Rob_ID = 'Rob1' AND
r.Rob_ID = ar.Rob_ID AND
ar.ROB_ID = ac.Rob_ID AND
ar.Arm_ID = ac.Arm_ID AND
ac.Arm_ID = m.Arm_ID AND
ac.Rob_ID = m.Rob_ID AND
ac.AxisNo = m.AxisNo AND
r.Rob_ID = re.Rob_ID AND
re.Eff_ID = e.Eff_ID
4-5
Beispiel: Resultat dieser Anfrage




diese SQL Anfrage liefert eine (“flache”, aber breite) Tabelle
bei 2 Armen á 4 Achsen und 6 Effektoren:
192 Tupel mit insgesamt 2.880 Attributwerten
wegen der relationalen Darstellung des Ergebnisses (1NF Relation):
nur 216 Werte (=8%) aus dieser Flut sind essenziell,
die anderen 92% sind redundant!
Konsequenz: SQL bzw. RDBMSe brauchen andere, zusätzliche
Strukturierungsmöglichkeiten für anspruchsvollere Anwendungen!
4-6
Basiskonstrukte von SQL-92

Tabellen
–
–
–
–

Basisdatentypen
–

INTEGER, SMALLINT, NUMERIC, DECIMAL,REAL,
FLOAT, CHARACTER, DATE, TIME, BIT, ...
MULTISET
ROW
Basisdatentyp
Integritätsbedingungen
–
–

Basistabellen zur Speicherung von Daten
Sichten (Views): abgeleitete Tabellen
Typ eines Attributs ist ein Basisdatentyp (1NF)
Zeilen (Tupel) setzen sich aus Instanzen der
jeweiligen Wertebereiche zusammen
Primär-/Fremdschlüssel, Check-Klauseln
Assertions: Bedingungen über mehrere Tabellen
Zugriffsrechte (Grants)
4-7
Tupeltabelle
•
Eine Tupeltabelle ist eine traditionelle Tabelle im Sinne von SQL-92
•
Eine solche Tabelle besteht aus einer (Multi-)Menge von Tupeln
Tabellenname
Spalten (Columns) = Attribute
R A1 ... An
...
Attributwerte
...
...
Zeilen (Rows) = Tupel
4-8
SQL-99 - Datenmodellerweiterungen

Neue Basisdatentypen: BOOLEAN, BLOB, CLOB

Neue Typkonstruktoren: ROW, ARRAY, REF

Benutzerdefinierte Datentypen (Distinct-Typ und strukturierte Typen)

Typhierarchien (Subtypen)

Typisierte Tabellen und Tabellenhierarchien (Subtabellen)

Typisierte Sichten und Sichthierarchien (Subsichten)
4-9
SQL-99 - Datenmodell
SET
MULTISET
OBJECT
ROW
ARRAY
REF
Einstiegspunkte in die Datenbank:
Typisierte Tabelle:
SET(OBJECT(...))
Untypisierte Tabelle:
MULTISET(ROW(...))
Basisdatentyp
Subtypbeziehung
Untermengenbeziehung
4-10
Neue Basisdatentypen (1)
BOOLEAN:
 3-wertige Logik
–
–
Werte:
 TRUE
 FALSE
 UNKNOWN
Operationen:
 NOT
 AND
 OR
 IS [NOT]
NOT
TRUE
FALSE
AND
TRUE
TRUE
TRUE
FALSE
FALSE
UNKNOWN UNKNOWN
OR
TRUE
FALSE
UNKNOWN
TRUE
TRUE
TRUE
TRUE
IS
TRUE
FALSE
UNKNOWN
TRUE
TRUE
FALSE
FALSE
FALSE
TRUE
UNKNOWN
UNKNOWN
FALSE
FALSE
FALSE
FALSE
UNKNOWN
UNKNOWN
FALSE
UNKNOWN
FALSE
UNKNOWN
TRUE
TRUE
FALSE
UNKNOWN
UNKNOWN UNKNOWN
FALSE
FALSE
TRUE
FALSE
UNKNOWN
FALSE
FALSE
TRUE
4-11
Neue Basisdatentypen (2)
Large Objects
–
–
–
–
BLOB (Binary Large Object)
CLOB (Character Large Object)
Operationen
 SUBSTRING, OVERLAY, || (Konkatenation)
 IS [NOT] NULL, LIKE, EQUALS, POSITION, LENGTH, SIMILAR
Nicht erlaubt
 BLOB/CLOB-Attribute als Teil eines Schlüssels
 GROUP BY, ORDER BY, GREATER/LESS THAN
4-12
Neue Basisdatentypen - Beispiel
Definition einer Tabelle mit BOOLEAN- und LOB-Attributen:
CREATE TABLE MitarbeiterTupelTabelle (
Name
VARCHAR(30),
Vollzeit BOOLEAN,
Bild
BLOB(1M),
Bewerbung CLOB(50k)
);
Verwendung von BOOLEAN- und LOB-Attributen:
SELECT Name
FROM MitarbeiterTupelTabelle
WHERE Vollzeit IS TRUE AND
POSITION ('Datenbanken' IN Bewerbung) > 0;
4-13
Tupeltypkonstruktor - ROW
Erzeugen eines Tupeltyps:
ROW(Feldname_1 Datentyp_1, ..., Feldname_n Datentyp_n)
Beispiel:
ALTER TABLE MitarbeiterTupelTabelle
ADD COLUMN Anschrift ROW(Strasse VARCHAR(30),
Nr DECIMAL(4),
PLZ DECIMAL(5),
Ort VARCHAR(40),
Land VARCHAR(25));
4-14
Operationen auf Tupeltypen
Erzeugen eines Tupels mit dem Tupelkonstruktor (der genauso wie der
Tupeltypkonstruktor heisst): ROW('Seestrasse', 31, 8008, 'Zürich', 'Schweiz')
Zugriff auf ein Tupelfeld
mittels Punktnotation:
SELECT Name, Anschrift.ORT
FROM MitarbeiterTupelTabelle
Vergleich zweier Tupel:
ROW(1, 2, 7) = ROW(1, 2, 7)
-- liefert TRUE
ROW(1, 2, 7) = ROW(1, 3, 7)
-- liefert FALSE
ROW(1, 2, 7) = ROW(1, NULL, 7) -- liefert UNKNOWN
ROW(1, 2, 7) < ROW(1, 3, 5)
ROW(1, 2, 7) < ROW(1, 1, 7)
ROW(1, 2, 7) < ROW(1, NULL, 7)
ROW(1, 2, 7) < ROW(1, 3, NULL)
-- liefert TRUE
-- liefert FALSE
-- liefert UNKNOWN
-- liefert TRUE
4-15
Arraytypkonstruktor - ARRAY
Erzeugen eines Arraytyps:
Elementtyp ARRAY[Maximale-Kardinalität]
Beispiel:
ALTER TABLE MitarbeiterTupelTabelle
ADD COLUMN Sprachkenntnisse VARCHAR(15) ARRAY[8];
4-16
Operationen auf Arraytypen (1)
Erzeugen eines Arrays mit dem Arraykonstruktor (der genauso wie der
Arraytypkonstruktor heisst): ARRAY('Deutsch', 'Englisch')
Direkter Zugriff auf das
i-te Arrayfeld mittels [i]:
SELECT Sprachkenntnisse[2]
FROM MitarbeiterTupelTabelle;
Deklarativer Elementzugriff
mittels Entschachtelung:
SELECT s
FROM MitarbeiterTupelTabelle,
UNNEST(Sprachkenntnisse) s;
4-17
Operationen auf Arraytypen (2)
Änderung eines einzelnen
Arrayelements:
UPDATE MitarbeiterTupelTabelle
SET
Sprachkenntnisse[1] = 'Türkisch';
Änderung des kompletten
Arraywerts:
UPDATE MitarbeiterTupelTabelle
SET
Sprachkenntnisse = ARRAY['Türkisch'];
Kardinalität liefert Anzahl
der Arrayelemente:
CARDINALITY(ARRAY['Deutsch', Türkisch'])
-- liefert den Wert 2
4-18
Operationen auf Arraytypen (3)
Konkatenation zweier Arrays:
ARRAY['Deutsch', 'Türkisch'] ||ARRAY['Englisch']
-- erzeugt ARRAY['Deutsch', 'Türkisch', 'Englisch']
Vergleich zweier Arrays:
—
—
Zwei Arrays sind vergleichbar g.d.w. ihre Elementtypen vergleichbar sind
Zwei vergleichbare Array A1 und A2 sind gleich (A1=A2) g.d.w
(1) sie die gleiche Kardinalität besitzen und
(2) alle Elemente paarweise gleich sind
ARRAY['Deutsch', 'Türkisch'] <> ARRAY['Deutsch', 'Türkisch', 'Englisch']
ARRAY['Deutsch', 'Türkisch'] = ARRAY['Deutsch', 'Türkisch', NULL]
-- liefert TRUE
-- liefert FALSE
4-19
Referenztypkonstruktor - REF
Erzeugen eines Referenztyps:
REF(Strukturierter-Typ) [SCOPE (TypisierteTabelle)]
–
–
referenzierter Typ muss ein strukturierter Typ sein
Instanzen eines Referenztyp können nur dann dereferenziert werden, wenn eine
entsprechend typisierte Tabelle als Wertebereich (Scope) festgelegt wurde
Beispiel:
ALTER TABLE MitarbeiterTupelTabelle
ADD COLUMN Abteilung REF(AbteilungsTyp) SCOPE Abteilungen;
–
AbteilungsTyp sei hier ein strukturierter Typ und Abteilung eine auf diesem Typ
basierende typisierte Tabelle
4-20
Operationen auf Referenztypen
Erzeugen einer Referenz auf ein Objekte durch Zuweisung der zugehörigen OID an ein
Referenzattribut bzw. Referenzvariable
Dereferenzierung mittels PfeilOperator:
SELECT Abteilung->Name
FROM MitarbeiterTupelTabelle;
Referenzauflösung mittels
DEREF-Operator:
SELECT DEREF(Abteilung)
FROM MitarbeiterTupelTabelle;
Vergleich zweier Referenzen:
—
—
Zwei Referenzen sind vergleichbar g.d.w. ihre referenzierten Typen gleich sind
Zwei vergleichbare Referenzen R1 und R2 sind gleich (R1=R2) g.d.w sie
denselben Referenzwert aufweisen (d.h. auf dasselbe Objekte verweisen)
4-21
Neue Typkonstruktoren - Beispiele (1)
Verwendung des Tupel- bzw. Arraytypkonstruktors:
INSERT INTO MitarbeiterTupelTabelle(Name, Sprachkenntnisse)
VALUES (ROW('Billy', 'Clintwood'),
ARRAY['Deutsch', 'Englisch', 'Türkisch']);
Zugriff auf tupelwertige Attribute bzw. Verwendung arraywertiger Attribute:
SELECT Name.Nachname
FROM MitarbeiterTupelTabelle
WHERE Name.Vorname = 'John' AND
'Deutsch' IN (SELECT * FROM UNNEST(Sprachkenntnisse));
4-22
Neue Typkonstruktoren - Beispiele (2)
Änderung einer Tupelkomponente:
UPDATE MitarbeiterTupelTabelle
SET Name.Nachname = 'Türker'
WHERE Name.Nachname = 'Tuerker';
Änderung eines Arrayelements mittels direktem Positionszugriff:
UPDATE MitarbeiterTupelTabelle
SET Sprachkenntnisse[4]= 'Französisch'
WHERE Name.Nachname = 'Türker';
4-23
Distinct-Typen
Kopie eines existierenden Datentyps mit neuem Namen
–
–
–
–
–
Wiederverwendung
Strenge Typisierung (basiert auf Namensäquivalenz)
Nicht-optionales Schlüsselwort FINAL schliesst Subtypbildung aus
Systemdefinierte Vergleichsoperatoren basierend auf dem Quelltyp
Cast-Operatoren zur Konversion zwischen Distinct- und Quelltyp
Erzeugen eines
Distinct-Typs:
Beispiele:
CREATE TYPE Distinct-Typname AS (Quelltyp) FINAL
[CAST (SOURCE AS DISTINCT) WITH Funktionsname]
[CAST (DISTINCT AS SOURCE) WITH Funktionsname]
CREATE TYPE Franken AS DECIMAL(12,2) FINAL;
CREATE TYPE Euro AS DECIMAL(12,2) FINAL;
4-24
Operationen auf Distinct-Typen
Erzeugen einer Instanz eines Distinct-Typs:
Distinct-Typname(Quelltypwert)
z.B. Franken(1311.69) oder
Euro(170470.13)
Vergleich zweier Distinct-Werte:
— Distinct-Typen unterliegen der strengen Typisierung
— Zwei Distinct-Werte sind vergleichbar g.d.w. ihre Distinct-Typen identisch sind
— Beispiel: Franken(1000.00) = Euro(1000.00) ergibt einen Typkonflikt
4-25
Verwendung von Distinct-Typen (1)
Beispiel: Distinct-Typen in Tabellendefinitionen:
CREATE TABLE CHBank(Nr INTEGER, Stand Franken);
CREATE TABLE EuroBank(Nr INTEGER, Stand Euro);
Anfrage basierend auf Distinct-Typen:
SELECT e.Nr
FROM CHBank c, EuroBank e
WHERE c.Nr= 234302 AND
c.Stand > e.Stand;
Anfrage ergibt Typkonflikt:
Schweizer Franken und Euro
sind nicht vergleichbar
→ Typkonvertierung ist notwendig!
→ CAST-Funktionen
4-26
Verwendung von Distinct-Typen (2)
Vorherige Anfrage nun mit expliziter Konvertierung von Euro nach Franken:
SELECT e.Nr
FROM CHBank c, EuroBank e
WHERE c.Nr= 234302 AND
c.Stand > CAST(CAST(e.Stand AS DECIMAL(12,2)) AS Franken);
Problem: Derartige Konvertierungen sind nicht immer "semantisch" sinnvoll!
Oftmals sind benutzerdefinierte Cast-Funktionen notwendig, die nicht nur
den Typ, sondern auch den Wert konvertieren bzw. neu berechnen.
4-27
Benutzerdefinierte Cast-Funktionen

Konversion zwischen unterschiedlichen Datentypen

Syntax:
CREATE CAST (Typ1 AS Typ2)
WITH Konvertierungsfunktion(Parameter Typ1) [AS ASSIGNMENT]
–
–
–
Typ1 oder Typ2 muss ein benutzerdefinierter Typ oder ein Referenztyp sein
Konvertierungsfunktion
– hat genau einen Parameter vom Typ Typ1 und Typ2 als Rückgabetyp
– ist deterministisch und liest und ändert keine SQL-Daten
AS ASSIGNMENT: Implizite Cast-Funktion (wird automatisch aufgerufen)
4-28
Explizite Cast-Funktionen - Beispiel
Definition einer Konvertierungsfunktion:
CREATE FUNCTION Franken(e Euro)
RETURNS Franken
RETURN CAST(CAST(e AS DECIMAL(12,2)) * 1.5 AS Franken);
Definition einer expliziten Cast-Funktion:
CREATE CAST (Euro AS Franken) WITH Franken(Euro);
Vorherige Anfrage nun mit direkter Konvertierung von Euro nach Franken:
SELECT e.Nr
FROM CHBank c, EuroBank e
WHERE c.Nr= 234302 AND
c.Stand > Franken(e.Stand);
4-29
Implizite Cast-Funktionen - Beispiel
Definition einer Konvertierungsfunktion:
CREATE FUNCTION Euro(f Franken)
RETURNS Euro
RETURN CAST(CAST(f AS DECIMAL(12,2)) * 0.65 AS Euro);
Definition einer impliziten Cast-Funktion:
CREATE CAST (Franken AS Euro) WITH Euro(Franken) AS ASSIGNMENT;
Vorherige Anfrage nun mit impliziter Konvertierung von Franken nach Euro:
SELECT e.Nr
FROM CHBank c, EuroBank e
WHERE c.Nr= 234302 AND
c.Stand > e.Stand;
4-30
Strukturierte Typen
Abstrakte Objekttypen mit Verhalten und eingekapselter Struktur
–
–
–
–
–
Optional: Subtypbildung mittels UNDER-Klausel
Optional: Instanziierung verbieten
Nicht-optionales Schlüsselwort NOT FINAL erlaubt Subtypbildung
Optional: Bestimmen der Referenzgenerierung (OID-Erzeugung)
Optional: Objektverhalten in Methoden kodieren
Syntax:
CREATE TYPE Typname [UNDER Supertypname]
AS (Attributdefinitionsliste)
[[NOT] INSTANTIABLE]
NOT FINAL
[Referenzgenerierung [Referenzcasting]]
[Methodendeklarationsliste]
4-31
Attributdefinition
Syntax:
Attributname Typ
[REFERENCES ARE NOT CHECKED
| REFERENCES ARE CHECKED ON DELETE NO ACTION]
[DEFAULT Defaultwert]
–
–
Bei Referenzattributen, die mit einer SCOPE-Klausel versehen sind,
muss auch die REFERENCES-Klausel spezifiziert werden
Default: REFERENCES ARE NOT CHECKED
 Ungültige Referenzen sind möglich
4-32
Strukturierte Typen - Beispiele
Instanzen strukturierter Typen heissen Objekte
CREATE TYPE AdresseTyp AS (
Strasse VARCHAR(30),
Nr
DECIMAL(4),
PLZ
DECIMAL(5),
Ort
VARCHAR(40),
Land
VARCHAR(25)
) NOT FINAL;
Basisdatentypen
CREATE TYPE PersonTyp AS (
Name
VARCHAR(30),
Anschrift
AdresseTyp,
Ehepartner
REF(PersonTyp),
Kinder
REF(PersonTyp) ARRAY[10]
) NOT FINAL;
Strukturierter Typ
Einbettung
Referenz
Konstruierte Typen
4-33
Operationen auf strukturierten Typen (1)
Erzeugen einer Instanz eines strukturierten Typs mit dem Default-Konstruktor, der
genauso heisst wie der zugehörige strukturierte Typ:
z.B. AdresseTyp() oder PersonTyp()
Attributzugriff erfolgt mittels Funktionsaufrufe sowie Punkt-Operator
Vergleich zweier Objekte (Instanzen strukturierter Typen):
— keine Ordnungsrelationen implizit bereitgestellt
— benutzerdefinierte Ordnungsfunktionen können aber definiert werden
4-34
Operationen auf strukturierten Typen (2)
Typtest:
Objekt IS [NOT] OF (Typnamensliste)
Prädikat IS OF wird TRUE, wenn die Liste den Typ des Objekts bzw. einen
Subtyp davon enthält
— Letzteres kann durch die Verwendung von ONLY ausgeschlossen werden, z.B.
—
m IS OF (ONLY(Mitarbeiter))
Temporäre Typanpassung entlang einer Typhierarchie:
(Objekt AS Supertypname)
TREAT(Objekt AS Subtypname)
-- Anpassung nach oben
-- Anpassung nach unten
4-35
Einkapselung von strukturierten Typen

Vollständige Einkapselung
–
–

Attribute nur über Methoden zugreifbar
Attributzugriffe und Methodenaufrufe gleich behandelt
Implizite Observer- und Mutator-Methoden für jedes Attribut
Observer:
FUNCTION Strasse(AdresseTyp) RETURNS VARCHAR(30);
FUNCTION Nr(AdresseTyp)
RETURNS DECIMAL(4);
FUNCTION PLZ(AdresseTyp) RETURNS DECIMAL(5);
FUNCTION Ort(AdresseTyp)
RETURNS VARCHAR(40);
FUNCTION Land(AdresseTyp) RETURNS VARCHAR(25);
Mutator:
FUNCTION Strasse(AdresseTyp, VARCHAR(30))
FUNCTION Nr(AdresseTyp, DECIMAL(5))
FUNCTION PLZ(AdresseTyp, DECIMAL(5))
FUNCTION Ort(AdresseTyp, VARCHAR(40))
FUNCTION Land(AdresseTyp, VARCHAR(25))
RETURNS AdresseTyp;
RETURNS AdresseTyp;
RETURNS AdresseTyp;
RETURNS AdresseTyp;
RETURNS AdresseTyp;
4-36
Attributzugriff bei Instanzen eines strukturierten Typs

Zugriff über Funktionsaufrufe oder Punkt-Operator
–
–

Pfadausdrücke: Nacheinander Anwendung des Punkt-Operators
–

X.Attributname
entspricht Attributname(X)
SET X.Attributname = Wert entspricht Attributname(X, Wert)
Navigierende Zugriffe
Beispiel:
BEGIN
END;
DECLARE p PersonTyp;
SET p.Name = ‘Luke Skywalker’;
SET p.Anschrift.Ort = ‘Hollywood’;
4-37
Erzeugen von Instanzen eines strukturierten Typs


Verwendung des Default-Konstruktors
Initialisierung mittels
–
–

Mutator-Methoden
Redefiniertem Konstruktor (kann beliebig überladen werden)
Beispiel für das Überladen eines Konstruktors:
CREATE FUNCTION PersonTyp (n VARCHAR(30))
RETURNS PersonTyp
BEGIN
DECLARE p PersonTyp;
SET p = PersonTyp();
SET p.Name = n;
RETURN p;
END;
Aufruf des
Default-Konstruktors
4-38
Subtypbildung - Aufbau von Typhierarchien

Subtypdefinition mittels UNDER-Klausel
–
–
–
–

Subtyp erbt alle Attributen und Methoden des Supertyps
Supertyp muss selbst ein strukturierter Typ sein
Subtyp darf maximal einen direkten Supertyp haben
 Keine (direkte) Mehrfachvererbung möglich
Subtyp kann geerbte Methoden überschreiben und überladen
Strukturierte Typen, die keine Subtypen sind, heissen Wurzeltypen
4-39
Subtypen - Beispiele
CREATE TYPE MitarbeiterTyp UNDER PersonTyp AS (
PNr
INTEGER,
Bewerbung
CLOB(50K),
Bild
BLOB(5M),
Vorgesetzter
REF(MitarbeiterTyp),
Projekte
REF(ProjektTyp) ARRAY[50],
Gehalt
Franken
) NOT FINAL;
CREATE TYPE ManagerTyp UNDER MitarbeiterTyp AS (
Leitet
REF(ProjektTyp) ARRAY[100],
Bonus
Franken
) NOT FINAL;
4-40
Referenzgenerierung & Referenzcasting

Nur für Wurzeltypen definierbar

Syntax:
REF USING Typ
| REF FROM (Attributliste)
| REF IS SYSTEM GENERATED
CAST (SOURCE AS REF) WITH Funktionsname
CAST (REF AS SOURCE) WITH Funktionsname
–
REF USING Typ
 OID-Werte sind von einem bestimmten Typ, etwa INTEGER
–
REF FROM (Attributliste)
 OID aus vorhandenen Attributwerten eines Schlüssels funktional bestimmt
–
REF IS SYSTEM GENERATED
 OID-Generierung durch das System (Defaulteinstellung)
4-41
Methoden

Objektverhalten in Methoden kodiert

Methoden sind Funktionen, die zu einem strukturierten Typen gehören
–
–

Deklaration erfolgt innerhalb der Typdefinition
Besitzen impliziten SELF-Parameter
Overloading, Overriding und Late Binding
–
–
Überladen von Methodennamen
 mehrere gleichnamige Methoden mit unterschiedlichen Parametern
Dynamisches Binden von überschriebenen Methoden zur Laufzeit
 Auswahl der Implementierung hängt vom Objekttyp ab
4-42
Methodendeklaration

Syntax: Deklaration einer Methode
[INSTANCE | STATIC]
METHOD Methodenname (Parameter)
RETURNS Rückgabetyp
[Methodencharakteristikaliste]

STATIC definiert Tabellenmethode
Syntax: Deklaration einer "überschreibenden" Methode
OVERRIDING
METHOD Methodenname (Parameter)
RETURNS Rückgabetyp
4-43
Methodencharakteristika (1)

Syntax:
[LANGUAGE {ADA|C|COBOL|FORTRAN|MUMPS|PASCAL|SQL}]
[PARAMETER STYLE {SQL | GENERAL}]
[[NOT] DETERMINISTIC]
[NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA]
[{RETURNS NULL | CALLED} ON NULL INPUT ]
[TRANSFORM GROUP Gruppenname [FOR TYPE StrukturierterTyp]]
4-44
Methodencharakteristika (2)

Angabe, ob die Berechnung deterministisch ist oder nicht
–
Relevant für CHECK- und CASE-Definition
NOT DETERMINISTIC
Zwei aufeinanderfolgende Aufrufe der Methode mit
den gleichen Argumenten können selbst bei gleichen
DB-Zuständen unterschiedliche Resultate liefern
(Beispiel: Methoden, die DATETIME abfragen)
DETERMINISTIC
Methode hat in zwei aufeinanderfolgenden Aufrufen
mit den gleichen Argumenten auf dem gleichen DBZustand den gleichen Effekt
4-45
Methodencharakteristika (3)

Angabe, ob und welche Art von SQL-Anweisungen eine Methode enhält
NO SQL
Enthält keine SQL-Anweisungen
CONTAINS SQL
Enthält SQL-Anweisungen
READS SQL DATA
Liest SQL-Daten
MODIFIES SQL DATA
Schreibt SQL-Daten
4-46
Methodencharakteristika (4)

Angabe, ob Methode aufrufbar ist, wenn ein Parameter NULL ist
RETURNS NULL
ON NULL INPUT
Ist beim Aufruf der Methode mindestens einer der
Parameter NULL, dann wird die Methode nicht
ausgeführt und NULL zurückgeliefert
CALLED
ON NULL INPUT
Methode wird auch dann ausgeführt, wenn einer der
Parameter NULL ist
4-47
Methodencharakteristika (5)


Transformgruppen enthalten Funktionen, die automatisch aufgerufen
werden, wenn benutzerdefinierte Typen von der SQL-Umgebung in die
Host-Sprachumgebung (und umgekehrt) transferiert werden
Syntax: Definition einer Transformgruppe
CREATE TRANSFORM FOR BDTyp Gruppenname (
FROM SQL WITH Funktionsname(Parameter),
TO SQL WITH Funktionsname(Parameter)
)
4-48
Methodencharakteristika (5)

Defaulteinstellungen
INSTANCE
STATIC schliesst OVERRIDING aus
LANGUAGE SQL
LANGUAGE SQL schliesst NO SQL,
Parameterstyle-Klausel, Transform-Klausel aus
NOT DETERMINISTIC
CONTAINS SQL
CALLED ON NULL INPUT
4-49
Methodenklaration - Beispiele
CREATE TYPE PersonTyp AS (
...
) NOT FINAL
METHOD AnzahlKinder() RETURNS INTEGER;
CREATE TYPE MitarbeiterTyp AS (
...
) NOT FINAL
METHOD Einkommen() RETURNS Franken;
METHOD Gehaltserhöhung() RETURNS Franken;
CREATE TYPE ManagerTyp AS (
...
) NOT FINAL
OVERRIDING METHOD Einkommen() RETURNS Franken;
OVERRIDING METHOD Gehaltserhöhung() RETURNS Franken;
4-50
Methodendefinition

Implementierung einer deklarierten Methode

Syntax:
[INSTANCE | STATIC]
CREATE METHOD Methodenname (Parameter)
RETURNS Rückgabetyp
FOR StrukturierterTyp
Methodenrumpf

Methodenrumpf besteht aus einer SQL-Prozedur-Anweisung
–
–
–
Schemadefinitions- oder Schemamanipulationsanweisung
INSERT, UPDATE, DELETE, SELECT (SQL-Datenänderungsanweisungen)
...
4-51
Methodendefinition - Beispiele

Definition einer "lesenden" Methode
CREATE METHOD Einkommen()
RETURNS Franken
FOR MitarbeiterTyp
RETURN (SELF.Gehalt);

Überschreiben einer "lesenden" Methodendefinition
CREATE METHOD Einkommen()
RETURNS Franken
FOR ManagerTyp
RETURN (SELF.Gehalt + SELF.Bonus);
4-52
Erweiterung von SQL zur Programmiersprache
Compound statement
SQL variable declaration
IF statement
CASE statement
LOOP statement
WHILE statement
REPEAT statement
FOR statement
RETURN statement
CALL statement
Assignment statement
SIGNAL statement
BEGIN [ATOMIC] SQL-Anweisungen END;
DECLARE Variable Datentyp;
IF Prädikat THEN SQL-Anweisungen
ELSE SQL-Anweisungen END IF;
CASE X WHEN Prädikat THEN SQL-Anweisungen
ELSE SQL-Anweisungen END CASE;
LOOP SQL-Anweisungen END LOOP;
WHILE Prädikat DO SQL-Anweisungen END WHILE;
REPEAT SQL-Anweisungen UNTIL Prädikat END REPEAT;
FOR Loop-Variable AS Cursor-Spezifikation
DO SQL-Anweisungen END FOR;
RETURN Rückgabewert;
CALL Routine(Parameterliste);
SET Variable = Wert;
SIGNAL division_by_zero;
4-53
Definition einer "schreibenden" Methode
CREATE METHOD GehaltsErhöhung()
RETURNS Franken
FOR MitarbeiterTyp
BEGIN
DECLARE altesGehalt Franken;
altesGehalt = SELF.Gehalt;
IF (SELF.AnzahlKinder < 3) OR (SELF.AnzahlProjekte < 2) THEN
SET SELF.Gehalt = 1.03 * altesGehalt;
ELSE
SET SELF.Gehalt = 1.05 * altesGehalt;
ENDIF
IF (SELF.Gehalt > 500000) THEN raise_error(…);
RETURN SELF.Gehalt;
END;
4-54
Überschreiben einer "schreibenden" Methode
CREATE METHOD GehaltsErhöhung()
RETURNS Franken
FOR ManagerTyp
BEGIN
DECLARE altesGehalt Franken;
altesGehalt = SELF.Gehalt;
SET SELF.Gehalt = altesGehalt *
(1+0.01*(SELF.AnzahlProjekte
+SELF.AnzahlKinder));
IF (SELF.Gehalt > 25000000) THEN raise_error(…);
RETURN SELF.Gehalt;
END;
4-55
Einsatz strukturierter Typen

Als Attributtyp anderer strukturierter Typen

Als Parametertyp von Methoden, Funktionen und Prozeduren

Als Typ von SQL-Variablen

Als Typ einer typisierten Tabelle

Als Typ von Tabellenspalten
CREATE TABLE PersonTupelTabelle (
Stammdaten
PersonTyp,
Bild
BLOB(1M),
Lebenslauf
CLOB(50k)
);
4-56
Instanziierung und Verwendung strukturierter Typen

Instanziierung mittels (Typ-)Konstruktor
–
Geschachtelte Konstruktoraufrufe möglich
INSERT INTO PersonenTupelTabelle
VALUES (PersonTyp('Billy Bär',
AdresseTyp('Seefeldstrasse', 31, 8008, 'Zurich', 'CH'),
NULL, ARRAY(NULL)),
NULL, NULL);

Zugriff auf Objektattributwerte (und Aufruf von Methoden)
SELECT Stammdaten.Name, Stammdaten.AnzahlKinder
FROM PersonenTupelTabelle
WHERE Stammdaten.Anschrift.Ort = 'Zürich' AND
POSITION('Diplom' IN Lebenslauf) > 0;
4-57
Benutzerdefinierte Gleichheit von Instanzen

Vergleichbarkeit und Ordnung von Instanzen benutzerdefinierter Typen
–
–

Ordnungsformen: NONE, EQUALS ONLY, ORDER FULL
Ordnungskategorien:
 RELATIVE: Ordnungsfunktion ordnet jeweils zwei Instanzen
 MAP: Vergleich bzw. Ordnung basiert auf dem Ergebnis einer
Abbildungfunktion, die Instanzen auf Werte von Basisdatentypen abbildet
 STATE: Vergleich basiert auf paarweise Gleichheit der Attributwerte
Syntax:
CREATE ORDERING FOR BDTyp
{EQUALS ONLY | ORDER FULL} BY
{RELATIVE WITH Ordnungsfunktion(P1 BDTyp, P2 BDTyp)
| MAP WITH Abbildungsfunktion(Parameter BDTyp)
| STATE [Schemaname]}
4-58
Benutzerdefinierte Gleichheit von Instanzen (Forts.)

Einschränkungen
–
–
–
–
–

Alle Typen einer Typhierarchie müssen gleiche Ordnungsform besitzen
FULL erfordert RELATIVE oder MAP
STATE nur für strukturierte Typen definierbar
RELATIVE und STATE nur für Wurzeltypen definierbar
Dintinct-Typen: ORDER FULL
Definition von STATE für PersonTyp erzeugt automatisch:
CREATE FUNCTION EQUALS(p1 PersonTyp, p2 PersonTyp)
RETURNS BOOLEAN
RETURN (SPECIFICTYPE(p1) =SPECIFICTYPE(p2) AND
p1.Name = p2.Name AND p1.Anschrift = p2.Anschrift AND
p1.Ehepartner = p2.Ehepartner AND p1.Kinder = p2.Kinder);
4-59
Ordnungs- und Abbildungsfunktionen

Seien X, Y Instanzen eines benutzerdefinierten Typs Z
– Sei RF eine Ordnungsfunktion für Z. Dann gelten folgende Ordnungsrelationen:
X = Y ⇔ RF(X, Y) = 0
X < Y ⇔ RF(X, Y) = -1
X > Y ⇔ RF(X, Y) = 1
–
X ≠ Y ⇔ RF(X, Y) ≠ 0
X ≤ Y ⇔ RF(X, Y) ∈{-1, 0}
X ≥ Y ⇔ RF(X, Y) ∈{0, 1}
Sei MF eine Abbildungsfunktion für Z. Dann gelten folgende Ordnungsrelationen:
X θ Y ⇔ MF(X) θ MF(Y), wobei θ ∈{<, ≤, =, ≠, ≥, >}
4-60
Ordnung durch benutzerdefinierte Abbildungsfunktionen
Definition einer Abbildungsfunktion für strukturierten Typ AdresseTyp:
CREATE FUNCTION AdresseMap(a AdresseTyp)
RETURNS VARCHAR(104)
RETURN (a.Land || a.Ort || a.Strasse
|| CAST(a.Nr AS VARCHAR(4))
|| CAST(a.PLZ AS VARCHAR(5)));
Definition einer Ordnungsfunktion für strukturierten Typ AdresseTyp:
CREATE ORDERING FOR AdresseTyp
ORDER FULL BY MAP WITH AdresseMap(AdresseTyp);
4-61
Verwendung benutzerdefinierter Ordnungsfunktionen
Beispielanfragen, in denen eine Ordnungsfunktion zum Einsatz kommt:
SELECT Stammdaten.Name, Stammdaten.Anschrift
FROM PersonTupelTabelle
ORDER BY Stammdaten.Anschrift;
SELECT Stammdaten.Name, Stammdaten.Anschrift
FROM PersonTupelTabelle
WHERE Stammdaten.Anschrift < AdresseTyp('Seefeldstrasse', 31,
8008, 'Zürich', 'CH');
4-62
Zusammenfassung - Benutzerdefinierte Typen

Distinct-Typen als Kopien vorhandener Typen
–

Strenge Typisierung (Typkompatibilität über Namensäquivalenz)
Strukturierte Typen als abstrakte Objekttypen
–
–
–
–
–
–
Objekteinbettung vs. Objektreferenzierung (Kopier- vs. Referenzsemantik)
Kapselung (Implizite Observer- und Mutator-Methoden für alle Attribute)
Aggregationshierarchien (Strukturierte Typen zusammengesetzt aus anderen
strukturierten Typen)
Typhierarchien (Subtypbildung)
Overloading und Overriding von Methoden plus dynamisches Binden
Vergleichbarkeit und Ordnung
4-63
Tabellen

Einziges Konzept (Container), um Daten persistent speichern zu können

Bisher in SQL-92
–
–

Tabelle als Multimenge von Tupeln
TYPE(Tabelle) = MULTISET(ROW(TYPE(A1), ..., TYPE(An)))
 wobei TYPE(Ai) ein Basisdatentyp ist
Erweiterungen in SQL-99
–
–
–
Attribute können arraywertig, tupelwertig, objektwertig oder referenzwertig sein
Typ einer Tabelle kann durch einen strukturierten Typ festgelegt werden
 Derartige Tabellen heissen typisierte Tabellen (oft auch Objekttabellen)
 Zeilen entsprechen Objekten (Instanzen) des festgelegten Typs
Subtabellen (Tabellenhierachien)
4-64
Tabellen (Forts.)

Tupel- vs. Objekttabellen
–
–
–

Tupeltabelle = Tabelle, die einer Multimenge von Tupeln entspricht
Objekttabelle = Tabelle, die einer Menge von Objekten
(Instanzen eines strukturierten Typs) entspricht
Typisierte Tabelle = Tabelle, deren Typ ein benutzerdefinierter Typ ist
Aufgepasst
–
–
–
–
Tupeltabellen können objektwertige Attribute enthalten
Prinzipiell sind die gleichen Attributtypen für Tupel- und Objekttabellen erlaubt
SQL-99 verwendet den Begriff Typisierte Tabelle mit Objekttabellensemantik
Prinzipiell kann aber auch eine Tupeltabelle typisiert sein (siehe Informix; Kap.5)
4-65
Definition von Tupeltabellen

Syntax:

Tabellenelement:
–
–
–
CREATE TABLE Tabellenname (Tabellenelementliste)
Attributdefinition
| Tabellenintegritätsbedingung
| LIKE Tabellenname
Attributdefinition beinhaltet Festlegung des Datentyps und eventuell die Angabe
eines Defaultwerts sowie von Attibutbedingungen
 Datentyp ist ein Basisdatentyp, ein mittels (geschachtelter) Anwendung von
Typkonstruktoren konstruierter Typ oder ein benutzerdefinierter Typ
 SCOPE-Festlegung bei Referenzattributen zwingend notwendig
Definition von Tabellenintegritätbedingungen wie bisher in SQL-92
LIKE-Klausel kopiert Attributdefinitionen einer anderen Tabelle (ohne
Attributbedingungen und Defaultwerte)
4-66
Definition von Tupeltabellen - Beispiel
CREATE TABLE PersonTupelTabelle (
Name
ROW(Vorname VARCHAR(15),
Nachname VARCHAR(25)),
Anschrift
AdresseTyp,
Bild
BLOB(1M),
Lebenslauf
CLOB(50k),
Sprachkenntnisse VARCHAR(15) ARRAY[8],
Hobbies
VARCHAR(20) ARRAY[10]
);
• Instanzen einer Tupeltabelle heissen Tupel
4-67
Anfrage an Tupeltabellen - Beispiel
Die Anfrage
SELECT *
FROM PersonTupelTabelle;
liefert ein Ergebnis vom Typ
MULTISET(ROW(ROW(VARCHAR(15), VARCHAR(25)),
AdresseTyp,
BLOB(1M),
CLOB(50k),
ARRAY[8](VARCHAR(15)),
ARRAY[10](VARCHAR(20)))
4-68
Definition von typisierten Tabellen
• Typisierte Tabelle basiert auf einem strukturierten Typ auf
• Syntax:
CREATE TABLE Tabellenname OF StrukturierterTyp [UNDER Supertabelle] [(
[Referenzgenerierungsoption]
[Attributoptionsliste]
)]
• Attributoption: Attributname WITH OPTIONS Optionsliste
• Optionen:
SCOPE TypisierteTabelle
| DEFAULT Wert
| Integritätsbedingung
4-69
Referenzgenerierung

Legt OID-Attribut und die Generierung der OIDs fest

Muss für jede typisierte Wurzeltabelle angegeben werden

Darf nicht bei Subtabellen angegeben werden

Referenzgenerierungsoptionen
–
–
–
REF IS oid USER GENERATED
 OID-Generierung durch den Benutzer
REF IS oid SYSTEM GENERATED
 OID-Generierung durch das System
REF IS oid DERIVED (Attributliste)
 OID aus vorhandenen Attributwerten eines Schlüssels funktional bestimmt
4-70
Definition von typisierten Tabellen - Beispiel
CREATE TABLE Personen OF PersonTyp (
REF IS oid SYSTEM GENERATED,
Ehepartner WITH OPTIONS SCOPE Personen,
Kinder WITH OPTIONS SCOPE Personen
);


Instanzen einer typisierten Tabelle heissen Objekte
Nur Instanzen einer typisierten Tabelle können mittels eines Referenzattributs
referenziert werden!
–
SCOPE-Klausel bestimmt die typisierte Tabelle, die referenziert wird
4-71
Anfrage an typisierte Tabellen - Beispiel
Was ist der Ergebnistyp der folgenden Anfrage?
SELECT *
FROM Personen;
Vielleicht
SET(PersonTyp)
?
Oder doch
MULTISET(ROW(REF(PersonTyp),
VARCHAR(30),
AdresseTyp,
REF(PersonTyp),
ARRAY[10](REF(PersonTyp))))
?
4-72
Einfügen und Ändern in typisierten Tabellen - Beispiel
Erzeugen von Tabelleninhalten (impliziter Aufruf des PersonTyp-Konstruktors):
INSERT INTO Personen
VALUES ('Billy Bär',
AdresseTyp('Seefeldstrasse', 31, 8008, 'Zurich', 'CH'),
(SELECT REF(p) FROM Personen p WHERE p.Name = 'Mama Bär'),
ARRAY(NULL));
Belegen von Referenzattributen:
UPDATE Personen
SET Kinder[1] = (SELECT REF(p)
FROM Personen p
WHERE p.Name = 'Baby Bär')
WHERE Name = 'Billy Bär';
4-73
Selektion auf typisierten Tabellen - Beispiel
Zugriff auf ein Attribut eines eingebetteten Objektes erfolgt (analog zum
Tupelkomponentenzugriff) mittels Dot-Operator:
SELECT Name, Anschrift.Ort
FROM Personen;
Zugriff auf ein Attribut eines referenziertes Objekts erfolgt mittels PfeilOperator (entspricht Dereferenzierung plus Attributselektion):
SELECT Name, Ehepartner->Name
FROM Personen;
4-74
Subtabellenbildung - Aufbau von Tabellenhierarchien

Subtabellendefinition mittels UNDER-Klausel
–
–
–
–

Typ der Subtabelle muss ein direkter Subtyp des Typs der Supertabelle sein
(Tiefe) Extension der Subtabelle muss immer eine Untermenge der (tiefen)
Extension der Supertabelle sein
 Instanzen der Subtabelle sind auch Mitglieder der zugehörigen Supertabellen
Subtabelle darf maximal eine direkte Supertabelle haben
 Keine (direkte) Mehrfachspezialisierung möglich (single inheritance)
Subtabelle kann "geerbte" Integritätsbedingungen verschärfen bzw. neue
hinzudefinieren
Typisierte Tabellen, die keine Subtabellen sind, heissen Wurzeltabellen
4-75
Subtabellenbildung - Beispiele
CREATE TABLE Mitarbeiter OF MitarbeiterTyp UNDER Personen (
Vorgesetzter WITH OPTIONS SCOPE Mitarbeiter,
Projekte WITH OPTIONS SCOPE Projekte
);
CREATE TABLE Manager OF ManagerTyp UNDER Mitarbeiter (
Leitet WITH OPTIONS SCOPE Projekte
);
4-76
Typ- versus Tabellenhierarchie
Typ
CREATE TYPE PersonTyp
Typ
Supertyp
CREATE TYPE MitarbeiterTyp
UNDER PersonTyp
CREATE TABLE Spieler OF PersonTyp
CREATE TABLE Personen OF PersonTyp
Supertabelle
Typ
Typ
CREATE TABLE Mitarbeiter
OF MitarbeiterTyp UNDER Personen
CREATE TABLE Angestellter
OF MitarbeiterTyp
4-77
Einfügungen und Löschungen in Tabellenhierarchien

INSERT an Supertabellen propagiert und DELETE wirkt auf Sub- und Supertabellen
Personen
INSERT INTO Personen(Name) VALUES('Billy');
PersonTyp
('Billy', ...)
('Joe', ...)
('Jim', ...)
DELETE FROM Personen WHERE Name='Joe';
UNDER
Mitarbeiter
INSERT INTO Mitarbeiter(Name) VALUES('Joe');
INSERT INTO Mitarbeiter(Name) VALUES('Jim');
MitarbeiterTyp
('Joe', ...)
('Jim', ...)
DELETE FROM Mitarbeiter WHERE Name='Jim';
4-78
Anfragen an Tabellenhierarchien
SELECT * FROM Personen;
Zugriff auf tiefe Extension einer Supertabelle
liefert alle Personen, auch die Mitarbeiter
SELECT * FROM Mitarbeiter;
Zugriff auf tiefe Extension einer Subtabelle
liefert alle Mitarbeiter-Objekte mit den geerbten Personen-Attributen
SELECT * FROM ONLY(Personen);
Zugriff auf flache Extension einer Supertabelle
liefert alle Personen, die keine “speziellen” Personen (z.B. Mitarbeiter) sind
SELECT *
FROM Personen EXCEPT Mitarbeiter;
Zugriff auf Teil einer tiefen Extension
einer Supertabelle
liefert alle Personen, die keine Mitarbeiter sind
4-79
Dereferenzierung und Navigation
Dereferenzierung mittels DEREF (liefert Attributwerte eines referenzierten Objekts):
SELECT DEREF(Vorgesetzter)
FROM Mitarbeiter;
Dereferenzierung (von Referenzattributwerten) über Pfeil-Operator:
SELECT *
FROM Mitarbeiter
WHERE Vorgesetzter->Name = 'Billy';
Dereferenzierung mit anschliessendem Komponentenzugriff:
SELECT *
FROM Mitarbeiter
WHERE Vorgesetzter->Anschrift.PLZ = 65307;
4-80
Typinformation und Konversion
Explizite Konversion vom Sub- zum Supertyp:
SELECT Einkommen(m AS MitarbeiterTyp)
FROM Manager m;
Explizite Konversion vom Super- zum Subtyp:
SELECT Einkommen(TREAT(m AS ManagerTyp))
FROM Mitarbeiter m
WHERE m IS OF (ManagerTyp);
Zugriff auf allgemeinere
Einkommensmethode des
Typs MitarbeiterTyp
Zugriff auf speziellere
Einkommensmethode des
Typs ManagerTyp
Sei t eine Instanz eines benutzerdefinierten Typs und T eine Menge von
benutzerdefinierten Typen (inklusive all derer Subtypen), dann liefert das
Typprädikat t IS OF (T) TRUE g.d.w. der speziellste Typ von t Element von T ist
4-81
Substituierbarkeit

Instanz eines Subtyps kann in jedem Kontext benutzt werden, wo eine
Instanz eines Supertyps nutzbar ist
–
–
–
Eingabeargumente für Methoden, deren formale Parameter auf dem Supertyp
definiert sind
Rückgabewert einer Methode oder Funktion, für das der Supertyp als formaler
Typ definiert wurde
Zuweisungen zu Variablen oder Attributen des Supertyps
4-82
Overloading, Overriding und dynamisches Binden

Mehrere Methoden mit demselben Namen
–
–

Dynamisches Binden zur Laufzeit ("dynamic dispatch")
Bei identischer Methodensignatur wird die spezielleste Methodenimplementierung ausgewählt
Beispiel: Folgende Anfrage berechnet das Einkommen von Personen, wobei sich die
Berechnungsfunktionen entsprechend dem Typ der Person unterscheiden kann
SELECT Einkommen
FROM Personen;
4-83
Definition von typisierten Sichten
• Typisierte Sichten basieren analog zu typisierten Tabellen auf einem
strukturierten Typen
• Syntax:
CREATE VIEW Sichtenname OF StrukturierterTyp [UNDER Supersicht] [(
[Referenzgenerierungsoption]
[Attributoptionsliste]
)]
AS Anfrageausdruck
[WITH CHECK OPTION]
• Attributoption: Attributname WITH OPTIONS SCOPE TypisierteSicht
4-84
Definition von typisierten Sichten - Beispiele
CREATE VIEW GutBezahlteMitarbeiter OF MitarbeiterTyp
(REF IS oid USER GENERATED)
AS (SELECT * FROM ONLY(Mitarbeiter)
WHERE Gehalt > Franken(10000));
CREATE VIEW GuteManager OF ManagerTyp
(REF IS oid USER GENERATED)
AS (SELECT * FROM ONLY(Manager)
WHERE CARDINALITY(Leitet) > 3);
CREATE VIEW MehrsprachigePersonen OF PersonTyp
(REF IS oid USER GENERATED)
AS (SELECT * FROM ONLY(Personen)
WHERE CARDINALITY(Sprachkenntnisse) > 1);
4-85
Subsichtenbildung - Aufbau von Sichtenhierarchien

Subsichtendefinition mittels UNDER-Klausel
–
–
–

Typ der Subsicht muss ein direkter Subtyp des Typs der Supersicht sein
Extension der Subsicht ist immer eine Untermenge der Extension der Supersicht
 Genauer: Subsicht erweitert die Extension der Supersicht
Subsicht darf nur maximal eine direkte Supersicht haben
 Keine (direkte) Mehrfachspezialisierung möglich
Typisierte Sichten, die keine Subsichten sind, heissen Wurzelsichten
–
Benötigen Angabe der Referenzgenerierung
 SYSTEM GENERATED nicht erlaubt
 USER GENERATED notwendig, falls Subsichten erzeugt werden sollen
4-86
Subsichtenbildung - Beispiele
CREATE VIEW KinderreicheManager OF ManagerTyp
UNDER GutBezahlteMitarbeiter
AS (SELECT *
FROM ONLY(Manager)
WHERE CARDINALITY(Kinder) > 4);
Die Supersicht
GutBezahlteMitarbeiter
umfasst nun auch alle
"kinderreichen" Manager!
CREATE VIEW GutBezahlteManager OF ManagerTyp
UNDER GutBezahlteMitarbeiter
AS (SELECT *
FROM ONLY(Manager)
WHERE Gehalt > Franken(25000));
Die Supersicht
GutBezahlteMitarbeiter
umfasst nun auch alle
"gut bezahlten" Manager!
4-87
Tabellen- vs. Sichtenhierarchie
CREATE TABLE Personen
OF PersonTyp
CREATE VIEW MehrsprachigePersonen
OF PersonTyp
Supertabelle
CREATE TABLE Mitarbeiter
OF MitarbeiterTyp
UNDER PersonTyp
Supertabelle
CREATE TABLE Manager
OF ManagerTyp
UNDER MitarbeiterTyp
CREATE VIEW GutBezahlteMitarbeiter
OF MitarbeiterTyp
Supersicht
CREATE VIEW GutBezahlteManager
OF ManagerTyp
UNDER GutBezahlteMitarbeiter
4-88
Einfügungen und Löschungen in Sichtenhierarchien



Person
INSERTs und DELETEs an die
zugrundeliegenden Tabelle propagiert
Mit=GutBezahlteMitarbeiter
Mng=GutBezahlteManager
INSERT INTO Mit(Name)
VALUES('Billy');
INSERT INTO Mng(Name)
VALUES('Joe');
('Billy', ...)
('Joe', ...)
UNDER
Mit MitarbeiterTyp
Mitarbeiter MitarbeiterTyp
('Billy', ...)
('Joe', ...)
('Billy', ...)
('Joe', ...)
DELETE FROM Mit
WHERE Name='Joe';
UNDER
UNDER
Mng
PersonTyp
ManagerTyp
('Joe', ...)
Manager
ManagerTyp
('Joe', ...)
4-89
SQL-99 - Datenmodell
SET
MULTISET
OBJECT
ROW
ARRAY
REF
Einstiegspunkte in die Datenbank:
Typisierte Tabelle:
SET(OBJECT(...))
Untypisierte Tabelle:
MULTISET(ROW(...))
Basisdatentyp
Subtypbeziehung
Untermengenbeziehung
4-90
SFW-Block (1)

Grundgerüst einer SQL-Anfrage: SFW-Block
SELECT
FROM
[WHERE
[GROUP BY
[HAVING

Projektionsliste
Tabellenausdruck
Prädikat]
Attributliste]
Gruppenprädikat]
Was ist das Ergebnis einer Anfrage in SQL-99?
–
–
–
Tupeltabelle

Objekttabelle

Wert bzw. Kollektion — (In SQL:200n soll dies möglich sein)
4-91
SFW-Block (2)

SELECT: Was darf in der Projektionsliste stehen?
–
–
–

Attribute (auch abgeleitete, berechnete)
Methodenaufrufe
Unterabfragen


()
Nur skalare Unterabfragen,
die genau einen Wert liefern!
Beispiel:
SELECT m.Name, 12*m.Einkommen, (SELECT COUNT(*)
FROM Mitarbeiter
WHERE Vorgesetzter = REF(m))
FROM Manager m;
4-92
SFW-Block (3)

FROM: Welche Tabellenausdrücke sind erlaubt?
–
–
–
–
–

Tupeltabellen
Objekttabellen (auch flache Extensionen)
Kollektionsabgeleitete Tabellen
Methodenaufrufe (die Tabellen liefern)
Unterabfragen (abgeleitete Tabellen)



—

Beispiele: Kollektionsabgeleitete bzw. mittels Unterabfragen abgeleitete Tabellen
SELECT *
FROM Manager m, UNNEST(m.Leitet) p;
SELECT *
FROM (SELECT * FROM (Tabelle1 UNION Tabelle2) INTERSECT Tabelle3);
4-93
SFW-Block (4)

WHERE: Welche Prädikate sind erlaubt?
–
–
–

Prädikate über Attribute
Prädikate mit Methodenaufrufen
Prädikate mit Unterabfragen



Beispiel:
SELECT *
FROM Manager m
WHERE Name LIKE 'T%' AND Einkommen > 50000 AND
3 < (SELECT COUNT(*)
FROM Mitarbeiter
WHERE Vorgesetzter = REF(m));
4-94
Zusammenfassung

SQL-99 : Objektrelationale Erweiterung von SQL-92
–
–
–
–
–
Neue Basisdatentypen und Typkonstruktoren
Benutzerdefinierte Datentypen und Typhierarchien
Typisierte Tabellen und Tabellenhierarchien
Typisierte Sichten und Sichtenhierarchien
Neue Anfragenkonstrukte, z.B.
 Objektattributzugriff mittels Dot-Operator
 Dereferenzierung mittels DEREF und Pfeil-Operator
 Zugriff auf flache Extension einer Tabelle mittels ONLY
 Zugriff auf Typ eines Attributs bzw. Variablen mittels IS OF
 Zugriff auf Subtyp eines Attributs mittels TREAT
4-95
Herunterladen