Praktikum: Datenbankprogrammierung in SQL/ORACLE
Kapitel 9Objekt-RelationaleDatenbanksysteme
Integration von relationalen Konzepten und Objektorientierung:
• Komplexe Datentypen: Erweiterung des Domain-Konzeptsvon SQL-2 (vgl. DATE, Geo-Koordinaten)
• Abstrakte Datentypen (“Objekttypen”):
– Unterscheidung zwischen dem Zustand und Verhalteneines Objektes (Kapselung interner Funktionalitat).
– Im Gegensatz zu einem Tupel besitzt ein Objekt∗ Attribute (beschreiben seinen Zustand),∗ Methoden – Abfragen und Andern des Zustandes:
Prozeduren und Funktionen(Oracle 8: PL/SQL, Oracle 8i: auch Java, sieheFolie 324)∗ MAP/ORDER-Funktionen: Ordnung auf Objekttyp
• Spezielle Auspragungen:
– Geschachtelte Tabellen als Attributwerte,
– Erweiternde Datentypen (Spatial etc.),
– Built-In XMLType zur Verarbeitung von XML-Daten(siehe Folie 384).
9.0 Objekt-Relationale Konzepte 240
Praktikum: Datenbankprogrammierung in SQL/ORACLE
STUFEN DER OBJEKTORIENTIERUNG
“Konservative” objektrelationale Erweiterungen (seit Oracle 8)
(siehe Folie 242)
• Objekte als “Werte” von Attributen:Spalten einer Tupeltabelle konnen objektwertig sein.
• Objekte anstelle von Tupeln:Tabellen von Tupeln vs. Object Tables aus Objekten
• Typ definiert gemeinsame Signatur seiner Instanzen(Objekte)
• bereits behandelt: Komplexe Attributtypen. Besitzen nurWertattribute, keine Methoden.
Objektorientierte Datenbanken
(siehe Folie 268)
• Beziehungen nicht mehr uber Schlussel/Fremdschlusselsondern uber Referenzen⇒ Navigation anstatt Joins
• seit ORACLE 9i: Subtypen und Vererbung, Objekttypen ausJava-Klassen.
9.0 Objekt-Relationale Konzepte 241
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1 Objektrelationale Konzepte
Alles funktioniert (fast) genauso wie bisher:
• Spalten einer Tupeltabelle konnen objektwertig sein(vgl. Geo-Koordinaten)
• Tabellen von Tupeln vs. Object Tables aus Objekten
INSERT INTO <table>
VALUES(<object-constructor>(attr1, ..., attrn))
anstatt
INSERT INTO <table>
VALUES(attr1, ..., attrn)
• Zugriff auf Attribute wie bisher mit tablename.attr,
• zusatzlich Aufruf von Methoden mit tablename.meth(...).
9.1 Objekt-Relationale Konzepte 242
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1.1 Definition von Objekttypen
Typdeklaration
• Attribute,
• Signaturen der Methoden,
Typ-Implementierung
• Type Body: Implementierung der Methoden in PL/SQL
• seit Oracle 8i auch in PL/SQL+Java (siehe Folien 324und 330)
9.1 Objekt-Relationale Konzepte 243
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJEKTTYPDEKLARATION
CREATE [OR REPLACE] TYPE <type> AS OBJECT
(<attr> <datatype>,
<attr> <datatype>,...
MEMBER FUNCTION <func-name> [(<parameter-list>)]
RETURN <datatype>,...
MEMBER PROCEDURE <proc-name> [(<parameter-list>)],...
[ MAP MEMBER FUNCTION <func-name>
RETURN <datatype>, |
ORDER MEMBER FUNCTION <func-name>(<var> <type>)
RETURN <datatype>]
);
/ ← dieser Slash ist unbedingt notwendig!
• <parameter-list> wie in PL/SQL,
• ahnlich CREATE TABLE, aber keine Integritatsbedingungen(erst bei der (Objekt)tabellen-Definition)
9.1 Objekt-Relationale Konzepte 244
Praktikum: Datenbankprogrammierung in SQL/ORACLE
BEISPIEL: GEO-KOORDINATEN
• Methode Distance(geo-coord-Wert)
• MAP-Methode: Entfernung von Greenwich.
CREATE OR REPLACE TYPE GeoCoord AS OBJECT
(Latitude NUMBER,
Longitude NUMBER,
MEMBER FUNCTION Distance (other IN GeoCoord)
RETURN NUMBER,
MAP MEMBER FUNCTION Distance Greenwich
RETURN NUMBER
);
/ ← dieser Slash ist unbedingt notwendig!
[Filename: ObjRel/geocoord-type.sql]
• wenn der Objekttyp bereits existiert (wie in diesem Fall):
ALTER TYPE GeoCoord
ADD MEMBER FUNCTION Distance (other IN GeoCoord)
RETURN NUMBER,
ADD MAP MEMBER FUNCTION Distance_Greenwich
RETURN NUMBER
CASCADE INCLUDING TABLE DATA;
[Filename: ObjRel/geocoord-type-ext.sql]
• CASCADE: “forwards” definition to tables and data objectswhere it is used.
9.1 Objekt-Relationale Konzepte 245
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TYPE BODY
• Implementierung der Objektmethoden,
• muss der der bei CREATE TYPE vorgegeben Signaturentsprechen,
• fur alle deklarierten Methoden muss Implementierungangegeben werden.
• Variable SELF, um auf die Attribute des Host-Objekteszuzugreifen.
Funktionen: durfen den Datenbankzustand nicht verandern,
MAP/ORDER-Funktionen: kein Datenbankzugriff erlaubt
⇒ verwenden nur den Zustand der beteiligten Objekte.
9.1 Objekt-Relationale Konzepte 246
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TYPE BODY
CREATE [OR REPLACE] TYPE BODY <type>
AS
MEMBER FUNCTION <func-name> [(<parameter-list>)]
RETURN <datatype>
IS
[<var-decl-list>;]
BEGIN <PL/SQL-code> END;...
MEMBER PROCEDURE <proc-name> [(<parameter-list>)]
IS
[<var-decl-list>;]
BEGIN <PL/SQL-code> END;...
[MAP MEMBER FUNCTION <func-name>
RETURN <datatype> |
ORDER MEMBER FUNCTION <func-name>(<var> <type>)
RETURN <datatype>
IS
[<var-decl-list>;]
BEGIN <PL/SQL-code> END;]
END;
/
9.1 Objekt-Relationale Konzepte 247
Praktikum: Datenbankprogrammierung in SQL/ORACLE
BEISPIEL: GEO-KOORDINATEN
CREATE OR REPLACE TYPE BODY GeoCoord
AS
MEMBER FUNCTION Distance (other IN GeoCoord)
RETURN NUMBER
IS
BEGIN
RETURN 6370 * ACOS(COS(SELF.latitude/180*3.14)
* COS(other.latitude/180*3.14)
* COS((SELF.longitude -
other.longitude)/180*3.14)
+ SIN(SELF.latitude/180*3.14)
* SIN(other.latitude/180*3.14));
END;
MAP MEMBER FUNCTION Distance_Greenwich
RETURN NUMBER
IS
BEGIN
RETURN SELF.Distance(GeoCoord(51.5, 0));
END;
END;
/
[Filename: ObjRel/geocoord-body.sql]
9.1 Objekt-Relationale Konzepte 248
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ERZEUGUNG VON OBJEKTEN
• Konstruktormethode:
<type>(<arg 1>, ..., <arg n>)
Also kein NEW, sondern nur einfach
GeoCoord(48,8)
CityORType(’Berlin’, ’Berlin’, ’D’,
3472009, GeoCoord(52.45, 13.3))
METHODENAUFRUF
• Funktionen: in Anfragen oder in PL/SQL-Programmen
• Prozeduren: in PL/SQL-Programmen
• Syntax:
<object>.<method-name>(<argument-list>)
Beispiel
Wie gross ist der Abstand zwischen zwei Langengraden aufder Hohe von Berlin, bzw. am Aquator?
SELECT geoCoord(52.45,-30).Distance(geoCoord(52.45,-31))
FROM DUAL;
SELECT geoCoord(0,-30).Distance(geoCoord(0,-31))
FROM DUAL;
9.1 Objekt-Relationale Konzepte 249
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1.2 Zugriffscharakteristik (Veraltet – biseinschl. Version 8i notwendig)
• Explizite Angabe der Read/Write-Zugriffscharakteristik derMethoden in PRAGMA RESTRICTREFERENCES-Klauseln
• seit 9i: wird zur Compile-Time intern gemacht(uberpruft wurde es sowieso schon ...)
CREATE [OR REPLACE] TYPE <type> AS OBJECT
(<attr> <datatype>,
<attr> <datatype>,...
MEMBER FUNCTION <func-name> [(<parameter-list>)]
RETURN <datatype>,...
MEMBER PROCEDURE <proc-name> [(<parameter-list>)],...
[ MAP MEMBER FUNCTION <func-name>
RETURN <datatype>, |
ORDER MEMBER FUNCTION <func-name>(<var> <type>)
RETURN <datatype>, ]
[ <pragma-declaration-list>]
);
/9.1 Objekt-Relationale Konzepte 250
Praktikum: Datenbankprogrammierung in SQL/ORACLE
PRAGMA-KLAUSELN:
Read/Write-Zugriffscharakteristik
<pragma-declaration-list>:
fur jede Methode eine PRAGMA-Klausel
PRAGMA RESTRICT REFERENCES
(<method name>, <feature-list>);
<feature-list>:
WNDS Writes no database state,
WNPS Writes no package state,
RNDS Reads no database state,
RNPS Reads no package state.
Funktionen: es muss zugesichert werden, dass sie denDatenbankzustand nicht verandern:
PRAGMA RESTRICT REFERENCES
(<function name>, WNPS, WNDS);
MAP/ORDER-Funktionen: kein Datenbankzugriff erlaubt
PRAGMA RESTRICT REFERENCES
(<function-name>, WNDS, WNPS, RNPS, RNDS)
⇒ verwendet nur den Zustand der beteiligten Objekte.
9.1 Objekt-Relationale Konzepte 251
Praktikum: Datenbankprogrammierung in SQL/ORACLE
BEISPIEL: GEO-KOORDINATEN MIT
PRAGMA-KLAUSEL
CREATE OR REPLACE TYPE GeoCoord AS OBJECT
(Latitude NUMBER,
Longitude NUMBER,
MEMBER FUNCTION
Distance (other IN GeoCoord)
RETURN NUMBER,
MAP MEMBER FUNCTION
Distance Greenwich RETURN NUMBER,
PRAGMA RESTRICT REFERENCES
(Distance, WNPS, WNDS, RNPS, RNDS),
PRAGMA RESTRICT REFERENCES
(Distance Greenwich, WNPS, WNDS, RNPS, RNDS)
);
/
9.1 Objekt-Relationale Konzepte 252
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1.3 Verwendung von Objekttypen
• Als Werte von Attributen: “Spaltenobjekte”(vgl. Geo-Koordinaten)
• in Objekttabellen: TABLE OF <objecttype>
“Zeilenobjekte”vollwertige Objekte
9.1 Objekt-Relationale Konzepte 253
Praktikum: Datenbankprogrammierung in SQL/ORACLE
SPALTENOBJEKTE
• Attribut eines Tupels oder eines Objekts ist objektwertig:
CREATE TABLE Mountain
(Name VARCHAR2(20)
CONSTRAINT MountainKey PRIMARY KEY,
Elevation NUMBER,
Coordinates GeoCoord CONSTRAINT MountainCoord
CHECK ((Coordinates.Latitude >= -90) AND
(Coordinates.Latitude <= 90) AND
(Coordinates.Longitude > -180) AND
(Coordinates.Longitude <= 180)));
[Filename: ObjRel/mountain-table.sql]
• Constraints werden wie immer bei der Tabellendefinitionangegeben.
INSERT INTO Mountain
VALUES (’Feldberg’, 1493, GeoCoord(48.5, 7.5));
SELECT Name, mt.coordinates.distance(geocoord(90, 0))
FROM Mountain mt;
• Tupelvariable mt um den Zugriffspfad zucoordinates.distance eindeutig zu machen.
9.1 Objekt-Relationale Konzepte 254
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZEILENOBJEKTE
• Elemente von Objekttabellen,
• ihre Attribute verhalten sich genauso wie die Attribute vonTupeltabellen,
• zusatzlich kann man Methoden aufrufen,
• referentielle Integritatsbedingungen zwischen bestehendenrelationalen Tabellen und solchen Objekttabellen wie ublichformulierbar,
• (erhalten eine eindeutige OID und sind damitreferenzierbar)
CREATE TABLE <name> OF <object-datatype>
[(<constraint-list>)];
mit <constraint-list> wie bisher:
• attributbezogene Bedingungen entsprechen denSpaltenbedingungen:
<attr-name> [DEFAULT <value>]
[<colConstraint> ... <colConstraint>]
• Tabellenbedingungen: Syntax wie bei Tupeltabellen.
9.1 Objekt-Relationale Konzepte 255
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZEILENOBJEKTE
Beispiel: CityORType
Objekt-Relationaler City-Typ:
• Spalten des Typs sind literal- oder objektwertig,
• noch keine Objektreferenzen
CREATE OR REPLACE TYPE CityORType AS OBJECT
(Name VARCHAR2(50),
Province VARCHAR2(50),
Country VARCHAR2(4),
Population NUMBER,
Coordinates GeoCoord,
MEMBER FUNCTION Distance (other IN CityORType)
RETURN NUMBER,
MEMBER FUNCTION NoOfOrganizations
RETURN NUMBER);
/
[Filename: ObjRel/cityORtype.sql]
9.1 Objekt-Relationale Konzepte 256
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZEILENOBJEKTE
CREATE OR REPLACE TYPE BODY CityORType
AS
MEMBER FUNCTION Distance (other IN CityORType)
RETURN NUMBER
IS
BEGIN
RETURN SELF.coordinates.distance(other.coordinates);
END;
MEMBER FUNCTION NoOfOrganizations RETURN NUMBER
IS
n NUMBER;
BEGIN
SELECT count(*) INTO n
FROM Organization o
WHERE o.city = SELF.name
AND o.province = SELF.province
AND o.country = SELF.country;
RETURN n;
END;
END;
/
[Filename: ObjRel/cityORtypebody.sql]
9.1 Objekt-Relationale Konzepte 257
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJEKTTABELLEN: ZEILENOBJEKTE
• der (ggf. mehrspaltige) Primarschlussel wird alsTabellenbedingung angegeben,
• Die Fremdschlusselbedingung auf die relationale TabelleCountry wird ebenfalls als Tabellenbedingung angegeben:
CREATE TABLE ORCity OF CityORType
(PRIMARY KEY (Name, Province, Country),
FOREIGN KEY (Country) REFERENCES Country(Code));
• Objekte werden unter Verwendung des Objektkonstruktors<object-datatype> in Objekttabellen eingefugt.
INSERT INTO ORCity
SELECT CityORType
(Name, Province, Country, Population,
GeoCoord(Latitude, Longitude))
FROM City;
[Filename (beides zusammen): ObjRel/cityORtable.sql]
9.1 Objekt-Relationale Konzepte 258
Praktikum: Datenbankprogrammierung in SQL/ORACLE
VERWENDUNG VON OBJEKTTABELLEN
Auslesen und Andern von Attributwerten wie bekannt
• Auslesen:
SELECT Name FROM ORCity;
SELECT * FROM ORCity;
• Andern:
UPDATE ORCity cty
SET coordinates = NULL
WHERE cty.coordinates.latitude IS NULL;
Methodenaufrufe wie erwartet
SELECT Name, c.NoOfOrganizations() FROM ORCity c
WHERE c.NoOfOrganizations() > 0;
9.1 Objekt-Relationale Konzepte 259
Praktikum: Datenbankprogrammierung in SQL/ORACLE
VERWENDUNG VON OBJEKTTABELLEN
... Auslesen von Objekten als Objekte:
Das folgende geht so nicht:
SELECT cty1.Distance(cty2)
FROM ORCity cty1, ORCity cty2
WHERE cty1.Name=’Berlin’ AND cty2.Name=’Stuttgart’;
• cty2 ist eine SQL-Variable, die nicht direkt das Objektenthalt.
Die VALUE()-Funktion
VALUE (<var>)
selektiert ein Objekt als Objekt (ist nur auf Zeilenobjekteanwendbar!):
SELECT VALUE(cty)
FROM ORCity cty;
VALUE(Cty)(Name, Province, Country, Population,
Coordinates(Latitude, Longitude))
CityORType(’Berlin’, ’Berlin’, ’D’, 3472009, GeoCoord(52, 13))
CityORType(’Bonn’, ’Nordrh.-Westf., ’D’, 293072, GeoCoord(50, 8))
CityORType(’Stuttgart’, ’Baden-Wurtt., ’D’, 588482, GeoCoord(49, 9))...
9.1 Objekt-Relationale Konzepte 260
Praktikum: Datenbankprogrammierung in SQL/ORACLE
VERWENDUNG VON OBJEKTEN: VALUE
• (Zeilen)Objekte auf Gleichheit testen: mit value(...)
• Objekt als Argument einer Methode
SELECT cty1.Name, cty2.Name,
cty1.coordinates.Distance(cty2.coordinates)
FROM ORCity cty1, ORCity cty2
WHERE NOT VALUE(cty1) = VALUE(cty2);
SELECT cty1.Name, cty2.Name,
cty1.Distance(VALUE(cty2))
FROM ORCity cty1, ORCity cty2
WHERE NOT VALUE(cty1) = VALUE(cty2);
• Zuweisung eines Objektes mit einem SELECT
INTO-Statement an eine PL/SQL-Variable
set serveroutput on;
DECLARE c cityORtype;
BEGIN
SELECT VALUE(cty) INTO c
FROM ORcity cty
WHERE name=’Berlin’;
dbms_output.put_line(c.name);
END;
/9.1 Objekt-Relationale Konzepte 261
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1.4 ORDER- und MAP-Methoden
• Objekttypen besitzen im Gegensatz zu den DatentypenNUMBER und VARCHAR keine inharente Ordnung.
• Ordnung auf Objekten eines Typs kann uber dessenfunktionale Methoden definiert werden.
• Fur jeden Objekttyp eine MAP FUNCTION oder eine ORDER
FUNCTION.
MAP-Funktion: (Betragsfunktion)
• keine Parameter,
• bildet jedes Objekt auf eine Zahl ab.
• Lineare Ordnung auf dem Objekttyp, “Betragsfunktion”
• sowohl fur Vergleiche <, > und BETWEEN, als auch furORDER BY verwendbar.
ORDER-Funktion: (vgl. Methode compareTo(other) des“Comparable” Interfaces in Java)
• besitzt ein Argument desselben Objekttyps das mit demHostobjekt verglichen wird.
• Damit sind ORDER-Funktionen fur Vergleiche <, >geeignet, im allgemeinen aber nicht unbedingt furSortierung.
• MAP- und ORDER-Funktionen durfen keinen Datenbankzugriffenthalten.
9.1 Objekt-Relationale Konzepte 262
Praktikum: Datenbankprogrammierung in SQL/ORACLE
MAP-METHODEN: BEISPIEL
MAP-Methode auf GeoCoord :
CREATE OR REPLACE TYPE BODY GeoCoord
AS
:
MAP MEMBER FUNCTION Distance Greenwich
RETURN NUMBER
IS
BEGIN
RETURN SELF.Distance(GeoCoord(51.5, 0));
END;
END;
/
SELECT Name, cty.coordinates.latitude,
cty.coordinates.longitude,
cty.coordinates.Distance_Greenwich()
FROM ORCity cty
WHERE NOT coordinates IS NULL;
ORDER BY coordinates;
[Filename: ObjRel/orderby.sql]
9.1 Objekt-Relationale Konzepte 263
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ORDER-METHODEN
• Vergleich von SELF mit einem anderen Objekt desselbenTyps, das formal als Parameter angegeben wird.
• Ergebnis: NUMBER
– x < 0 falls SELF < Parameter,
– 0 (Gleichheit), oder
– x > 0 falls SELF > Parameter.
• Mit
SELECT ...
FROM <tablename> x
ORDER BY VALUE(x)
werden die Ausgabeobjekte paarweise verglichen undentsprechend der ORDER-Methode geordnet.
• Ein Beispiel hierfur ist die Erstellung derFussball-Bundesligatabelle: Ein Verein wird vor einemanderen plaziert, wenn er mehr Punkte hat. BeiPunktgleichheit entscheidet die Tordifferenz. Ist auch diesedieselbe, so entscheidet die Anzahl der geschossenenTore (vgl. Aufgabe).
9.1 Objekt-Relationale Konzepte 264
Praktikum: Datenbankprogrammierung in SQL/ORACLE
VERGLEICHE ZWISCHEN OBJEKTEN
• <, >, “between” und Ordnung basieren auf der MAP bzw.ORDER-Methode.
• Gleichheit/Ungleichheit:
– bei Zeilenobjekten: diese haben eine Objektidentitat;Vergleich mit VALUE(obj1) = VALUE(obj2).
– Anmerkung: bei Spaltenobjekten, wie z.B. Instanzenvon GeoCoord, ware ein Vergleich auf Objektidentitatnicht sinnvoll.
– der Vergleich obj1 = obj2
basiert auf der MAP bzw. ORDER-Methode.
⇒ Fehler beim Compilieren, falls keine solche definiert ist!
⇒ falls eine solche definiert ist, wird sie verwendet, unddamit “betragsgleiche” Objekte als gleich behandelt!
⇒ “Echten” Vergleich ggf. ausprogrammieren auf Basis der“Schlusselattribute” der Objekte (ggf. inequals(. . . )-Methode).
9.1 Objekt-Relationale Konzepte 265
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.1.5 Objektrelationale Modellierung:Zusammenfassung
• Objekte anstatt Tupel oder Attributwerte
• Anfragen praktisch unverandert gegenuber rein relationalerDB (insb. Beziehungen weiterhin uberSchlussel/Fremdschlussel und Join-basierte Anfragen)
• zusatzlich Methoden, Ordnungsmethoden.
9.1 Objekt-Relationale Konzepte 266
Praktikum: Datenbankprogrammierung in SQL/ORACLE
BEISPIEL/AUFGABE
(wird auf Folie 279 analog ausprogrammiert)
• City, Country, Organization als Objekttypen und -tabellen
• Komfortablere Methoden: Mitgliedschaften werden uberMethoden eingetragen und abgefragt (ohneBerucksichtigung der Arten der Mitgliedschaft):
organization.isMember(carcode)country.isMemberIn(org-abbrev)organization.makeMember(carcode)country.makeMemberIn(org-abbrev)
Interne Implementierung z.B. uber die bekannte TabelleisMember.
Hinweis: Boolesche Anfragen der Art “Ist x Mitglied in y”sind damit moglich. Es ist jedoch keine Methode “alleMitglieder von y moglich – diese musste eine Relation bzw.Menge zuruckgeben.
• ... man kann aber diese Implementierung dann auchbeliebig andern.
9.1 Objekt-Relationale Konzepte 267
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.2 Objektorientierte Modellierung
... soweit dienten die Datentypen im wesentlichen zurBereitstellung von spezialisiertem Verhalten:
• Built-in: DATE
• zusammengesetzt: Geo-Koordinaten
• Geschachtelte Tabellen (parametrisierter Datentyp)
• benutzerdefinierte Objekttypen
• Grundlage fur Datentypen wie XMLType etc.
Objektorientierte Modellierung
Geht uber die Nutzung als “Datentypen” hinaus ...
• ... zu Modellierungsaspekten:
• Spezialisierung: Klassenhierarchie; Subtypen alsSpezialisierung allgemeiner Typen.
• Objekt-Identitat und Referenzen auf Objekte als Werte vonAttributen zum Ausdrucken von Beziehungen,
• Objekte: Wertattribute und Referenzattribute.
• Anfragen durch Navigation etc. (⇒ unsymmetrisch)
9.2 Objekt-Relationale Konzepte 268
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJEKTREFERENZEN
• Weiterer Datentyp fur Attribute: Referenzen auf Objekte
<ref-attr> REF <object-datatype>
• Objekttyp als Ziel der Referenz.
• nur Objekte, die eine OID besitzen – also Zeilenobjekteeiner Objekttabelle – konnen referenziert werden.
• Erzeugen einer Referenz (Selektieren einer OID):
SELECT ..., REF(<var>), ...
FROM <object-table> <var>
WHERE ... ;
9.2 Objekt-Relationale Konzepte 269
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJEKTREFERENZEN: CONSTRAINTS
• Objekttyp kann in verschiedenen Tabellen vorkommen:Einschrankung auf eine bestimmte Tabelle bei derDeklaration der entsprechenden Tabelle als Spalten- oderTabellenconstraints mit SCOPE:
– als Spaltenconstraint (nur bei Tupeltabellen):<ref-attr> REF <object-datatype>
SCOPE IS <object-table>
– als Tabellenconstraint:SCOPE FOR (<ref-attr>) IS <object-table>
• problemlose Integration referentiellerIntegritatsbedingungen von Objekttabellen zu bestehendenrelationalen Tabellen.
• PRIMARY KEYs durfen keine REF-Attribute umfassen.
• Referentielle Integritatsbedingung
FOREIGN KEY (<ref-attr>) REFERENCES <object-table>
geht auch, wenn auf <object-table> kein Primary Keydefiniert ist (verwendet Object-ID).
9.2 Objekt-Relationale Konzepte 270
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Objekttyp Organization
CREATE TYPE Member_Type AS OBJECT
(Country VARCHAR2(4),
Type VARCHAR2(60));
/
CREATE TYPE Member_List_Type AS
TABLE OF Member_Type;
/
CREATE OR REPLACE TYPE Organization Type AS OBJECT
(Name VARCHAR2(80),
Abbrev VARCHAR2(12),
Members Member List Type,
Established DATE,
hasHqIn REF CityORType,
MEMBER FUNCTION isMember (the country IN VARCHAR2)
-- EU.isMember(’SLO’) = ’membership applicant’
RETURN VARCHAR2,
MEMBER FUNCTION people RETURN NUMBER,
MEMBER FUNCTION numberOfMembers RETURN NUMBER,
MEMBER PROCEDURE addMember
(the country IN VARCHAR2, the type IN VARCHAR2));
/
[Filename: Obj/org-type.sql]
9.2 Objekt-Relationale Konzepte 271
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Objekttyp Organization
Tabellendefinition:
CREATE TABLE Organization ObjTab OF Organization Type
(Abbrev PRIMARY KEY,
SCOPE FOR (hasHqIn) IS ORCity)
NESTED TABLE Members STORE AS Members nested;
• Type Body noch nicht definiert.Weiter erstmal nur mit einem Objekt als Beispiel:
Einfugen unter Verwendung des Objektkonstruktors:
INSERT INTO Organization ObjTab VALUES
(Organization Type(’European Community’, ’EU’,
Member List Type(), NULL, NULL));
Setzen des Referenzattributes hasHqIn:
UPDATE Organization ObjTab
SET hasHqIn =
(SELECT REF(cty)
FROM ORCity cty
WHERE Name = ’Brussels’
AND Province = ’Brabant’
AND Country = ’B’)
WHERE Abbrev = ’EU’;
[Filename (alles zusammen): Obj/org-table.sql]9.2 Objekt-Relationale Konzepte 272
Praktikum: Datenbankprogrammierung in SQL/ORACLE
SELEKTION VON OBJEKTATTRIBUTEN
• Wertattribute
SELECT Name, Abbrev, Members
FROM Organization_ObjTab;
Name Abbrev Members
European Community EU Member List Type(...)
• Referenzattribute:
SELECT <ref-attr-name>
liefert OID:
SELECT Name, Abbrev, hasHqIn
FROM Organization_ObjTab;
Name Abbrev hasHqIn
European Community EU <oid>
• DEREF(<oid>) liefert das zugehorige Objekt:
SELECT Abbrev, DEREF(hasHqIn)
FROM Organization_ObjTab;
Abbrev hasHqIn
EU CityORType(’Bruxelles’, ’Bruxelles’, ’B’,
168576, GeoCoord(4.35, 50.85))
9.2 Objekt-Relationale Konzepte 273
Praktikum: Datenbankprogrammierung in SQL/ORACLE
VERWENDUNG VON REFERENZATTRIBUTEN
• Attribute und Methoden eines referenzierten Objektswerden durch Pfadausdrucke der Form
SELECT <ref-attr-name>.<attr-name>
adressiert (“navigierender Zugriff ”).
• Aliasing mit einer Variablen um den Pfadausdruckeindeutig zu machen:
SELECT Abbrev, org.hasHqIn.name
FROM Organization ObjTab org;
Abbrev hasHqIn.Name
EU Bruxelles
• Auch erlaubt:
SELECT name, DEREF(hasHqIn).name
FROM Organization_ObjTab;
Die Funktionen VALUE, REF, DEREF
Mit REF und DEREF lasst sich VALUE ersetzen:
SELECT VALUE(org) FROM Organization_ObjTab org;
und
SELECT DEREF(REF(org)) FROM Organization_ObjTab org;
9.2 Objekt-Relationale Konzepte 274
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZYKLISCHE REFERENZEN
Die Modellierung als Objektgraph (d.h., Beziehungen nichtdurch Tabellen, sondern als Objektreferenzen) fuhrt oft zuZyklen:
• City Type: country REF Country Type
• Country Type: capital REF City Type
• Deklaration jedes Datentypen benotigt bereits dieDefinition des anderen.
• Definition von unvollstandigen Typen“Forward-Deklaration”:
CREATE TYPE <name>;
/
• wird spater durch eine komplette Typdeklaration erganzt.
9.2 Objekt-Relationale Konzepte 275
Praktikum: Datenbankprogrammierung in SQL/ORACLE
UNVOLLSTANDIGE DATENTYPEN
Unvollstandige Datentypen konnen nur zur Definition vonReferenzen auf sie benutzt werden, nicht zur Definition vonSpalten oder in geschachtelten Tabellen:
CREATE OR REPLACE TYPE City type;
/
• Die Nutzung in Referenzen ist damit erlaubt:
CREATE TYPE city list AS TABLE OF REF City type;
/
CREATE OR REPLACE TYPE Country Type AS OBJECT
(Name VARCHAR2(50),
Code VARCHAR2(4),
Capital REF City Type);
/
• Die direkte Nutzung ware erst erlaubt, wenn City typekomplett ist:
CREATE TYPE city list 2 AS TABLE OF City type;
/ -- waere eine Tabelle von City-Objekten
CREATE OR REPLACE TYPE Country Type 2 AS OBJECT
(Name VARCHAR2(50),
Code VARCHAR2(4),
Capital City Type);
/ -- Capital waere ein Spaltenobjekt
9.2 Objekt-Relationale Konzepte 276
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZYKLISCHE REFERENZEN: BEISPIEL
CREATE OR REPLACE TYPE City Type
/
CREATE OR REPLACE TYPE Country Type AS OBJECT
(Name VARCHAR2(50),
Code VARCHAR2(4),
Capital REF City Type,
Area NUMBER,
Population NUMBER);
/
CREATE OR REPLACE TYPE Province Type AS OBJECT
(Name VARCHAR2(50),
Country REF Country Type,
Capital REF City Type,
Area NUMBER,
Population NUMBER);
/
CREATE OR REPLACE TYPE City Type AS OBJECT
(Name VARCHAR2(50),
Province REF Province Type,
Country REF Country Type,
Population NUMBER,
Coordinates GeoCoord);
/
9.2 Objekt-Relationale Konzepte 277
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJEKTORIENTIERUNG:MODELLIERUNGSASPEKTE
• Beziehungen durch Referenzattribute,
• Anfragen per Navigation (anstatt Join),
• konnen nur in einer Richtung verfolgt werden,
• erfordert also doppelte Speicherung,
• mussen auf beiden Seiten separat konsistent gehaltenwerden.
Beispiel/Aufgabe
• City, Country, Organization als Objektgraph
• Beziehungen immer uber Methoden behandeln:
organization.isMember(carcode)country.isMemberIn(org-abbrev)organization.makeMember(carcode)country.makeMemberIn(org-abbrev)
• Interne Implementierung von z.B. Mitgliedschaften wieoben als Collection von Referenzen, oder uber diebekannte Tabelle isMember.
9.2 Objekt-Relationale Konzepte 278
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.3 Methoden: Funktionen undProzeduren
TYPE BODY enthalt die Implementierungen der Methoden inPL/SQL
Anpassung von PL/SQL an Objektrelationale Features
• PL/SQL unterstutzt keine Navigation entlangPfadausdrucken (in SQL ist es erlaubt).
• Jede MEMBER METHOD besitzt einen impliziten ParameterSELF, der das jeweilige Host-Objekt referenziert.
• Tabellenwertige Attribute konnen innerhalb PL/SQL wiePL/SQL-Tabellen behandelt werden:
Built-in Methoden fur Collections (PL/SQL-Tabellen)konnen auch auf tabellenwertige Attribute angewendetwerden:
<attr-name>.COUNT: Anzahl der in der geschachteltenTabelle enthaltenen Tupel
Verwendung in in PL/SQL eingebetteten SQL-Statements –z.B. SELECT <attr>.COUNT – nicht erlaubt.
• Weitere Erweiterung: Java (siehe Folie 324).
9.3 Objekt-Relationale Konzepte 279
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Member-Methods: Beispiel
CREATE OR REPLACE TYPE BODY Organization Type IS
MEMBER FUNCTION isMember (the country IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
IF SELF.Members IS NULL OR SELF.Members.COUNT = 0
THEN RETURN ’no’; END IF;
FOR i in 1 .. Members.COUNT
LOOP
IF the country = Members(i).country
THEN RETURN Members(i).type; END IF;
END LOOP;
RETURN ’no’;
END;
MEMBER FUNCTION people RETURN NUMBER IS
p NUMBER;
BEGIN
SELECT SUM(population) INTO p
FROM Country ctry
WHERE ctry.Code IN
(SELECT Country
FROM THE (SELECT Members
FROM Organization ObjTab org
WHERE org.Abbrev = SELF.Abbrev));
RETURN p;
END; (bitte umblattern)
9.3 Objekt-Relationale Konzepte 280
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Member-Methods: Beispiel (Forts.)
MEMBER FUNCTION numberOfMembers RETURN NUMBER
IS
BEGIN
IF SELF.Members IS NULL THEN RETURN 0; END IF;
RETURN Members.COUNT;
END;
MEMBER PROCEDURE addMember
(the country IN VARCHAR2, the type IN VARCHAR2) IS
BEGIN
IF NOT SELF.isMember(the country) = ’no’
THEN RETURN; END IF;
IF SELF.Members IS NULL THEN
UPDATE Organization ObjTab
SET Members = Member List Type()
WHERE Abbrev = SELF.Abbrev;
END IF;
INSERT INTO
THE (SELECT Members
FROM Organization ObjTab org
WHERE org.Abbrev = SELF.Abbrev)
VALUES (the country, the type);
END;
END;
/ [Filename: Obj/orgs-type-body.sql]
• FROM THE(SELECT ...) kann nicht durch FROM SELF.Members
ersetzt werden (PL/SQL vs. SQL).9.3 Objekt-Relationale Konzepte 281
Praktikum: Datenbankprogrammierung in SQL/ORACLE
METHODENAUFRUFE
Funktionen
• MEMBER FUNCTIONS konnen in SQL und PL/SQL durch<object>.<function>(<argument-list>) selektiertwerden.
• parameterlose Funktionen: <object>.<function>()
• aus SQL: <object> ist durch einen Pfadausdruck mit Aliasgegeben.
SELECT Name, org.isMember(’D’)
FROM Organization ObjTab org
WHERE NOT org.isMember(’D’) = ’no’;
(noch ist die Tabelle aber nicht sinnvoll gefullt ...)
Prozeduren
• MEMBER PROCEDURES konnen nur aus PL/SQL mit<objekt>.<procedure>(<argument-list>) aufgerufenwerden.
⇒ freie Prozeduren in PL/SQL, um MEMBER PROCEDURES
aufzurufen
9.3 Objekt-Relationale Konzepte 282
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Freie Prozedur
CREATE OR REPLACE PROCEDURE makeMember
(the org IN VARCHAR2, the country IN VARCHAR2,
the type IN VARCHAR2) IS
n NUMBER;
x Organization Type;
BEGIN
SELECT COUNT(*) INTO n
FROM Organization ObjTab
WHERE Abbrev = the org;
IF n = 0
THEN INSERT INTO Organization ObjTab
VALUES(Organization Type(NULL,
the org, Member List Type(), NULL, NULL));
END IF;
SELECT VALUE(org) INTO x
FROM Organization ObjTab org
WHERE Abbrev = the org;
IF x.isMember(the country)=’no’ THEN
x.addMember(the country, the type);
END IF;
END;
/
[Filename: Obj/makemember.sql]
EXECUTE makeMember(’EU’, ’USA’, ’special member’);
EXECUTE makeMember(’XX’, ’USA’, ’member’);
9.3 Objekt-Relationale Konzepte 283
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Fullen der Objekttabelle
Ubertragung des Datenbestandes aus den relationalenTabellen Organization und isMember in die ObjekttabelleOrganization ObjTab:
INSERT INTO Organization_ObjTab
(SELECT Organization_Type
(Name, Abbreviation, NULL, Established, NULL)
FROM Organization);
CREATE OR REPLACE PROCEDURE Insert_All_Members IS
BEGIN
FOR the_membership IN
(SELECT * FROM isMember)
LOOP makeMember(the_membership.organization,
the_membership.country,
the_membership.type);
END LOOP;
END;
/
EXECUTE Insert_All_Members;
UPDATE Organization ObjTab org
SET hasHqIn =
(SELECT REF(cty)
FROM ORCity cty, Organization old
WHERE org.Abbrev = old.Abbreviation
AND cty.Name = old.City
AND cty.Province = old.Province
AND cty.Country = old.Country);
[Filename: Obj/fill-organizations.sql]9.3 Objekt-Relationale Konzepte 284
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Beispiel: Nutzung freier Methoden
CREATE OR REPLACE FUNCTION isMemberIn
(the_org IN VARCHAR2, the_country IN VARCHAR2)
RETURN isMember.Type%TYPE IS
t isMember.Type%TYPE;
BEGIN
SELECT org.isMember(the_country) INTO t
FROM Organization_ObjTab org
WHERE Abbrev=the_org;
RETURN t;
END;
/
[Filename: Obj/is-member.sql]
SELECT isMemberIn(’EU’, ’TR’)
FROM DUAL;
isMemberIn(’EU’, ’TR’)
candidate
Es ist (zumindest bis ORACLE 12c) nicht moglich, durchNavigation mit Pfadausdrucken Tabelleninhalte zu verandern:
UPDATE Organization_ObjTab org
SET org.hasHqIn.Name = ’UNO City’ -- NICHT ERLAUBT
WHERE org.Abbrev = ’UN’;
9.3 Objekt-Relationale Konzepte 285
Praktikum: Datenbankprogrammierung in SQL/ORACLE
MODELLIERUNG VS. IMPLEMENTIERUNG
• Das Beispiel illustriert Objektmethoden und ihre Anbindungdurch freie Methoden am objektorientierten Szenario:
– Headquarter als Referenz,
– Mitglieder als geschachtelte Tabelle,
• man kann dieselben Methoden auch mit einerobjektrelationalen Tabelle OROrganization, und Ablegender Mitgliedschaften in der Relation isMember
implementieren (Aufgabe).
⇒ fur den Benutzer bleiben die freien Methoden dieselben.
9.3 Objekt-Relationale Konzepte 286
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.4 Klassenhierarchie und Vererbung
(Abschnitt ist optional)
geo object
water mountain desert island
sea lake river
9.4 Objekt-Relationale Konzepte 287
Praktikum: Datenbankprogrammierung in SQL/ORACLE
KLASSENHIERARCHIE UND VERERBUNG
• seit ORACLE 9i
• Typhierarchie:
• Subtyp: abgeleitet von einem Elterntyp
• Vererbung: Verbindung zwischen Subtypen und ihrenObertypen in einer Typhierarchie
• Subtypen: “Spezialisierung”
– hinzufugen neuer Attribute und Methoden
– overriding (Uberschreiben) von geerbten Methoden
• Spezielle Eigenschaften von Klassen:abstrakte (NOT INSTANTIABLE) und finale (FINAL)Klassen
• abstrakte Klassen konnen abstrakte Methoden(NOT INSTANTIABLE) haben
• Klassen konnen finale Methoden haben:diese konnen in Subklassen nicht uberschrieben werden
9.4 Objekt-Relationale Konzepte 288
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ERZEUGEN VON SUBTYPEN
Abstrakte Klasse fur geographische Objekte(die alle einen Namen besitzen):
CREATE OR REPLACE TYPE geo object type AS OBJECT (
name VARCHAR2(50),
MEMBER FUNCTION get name RETURN VARCHAR2,
NOT INSTANTIABLE
MEMBER FUNCTION set name RETURN VARCHAR2
)
NOT INSTANTIABLE -- DEFAULT: INSTANTIABLE
NOT FINAL; -- DEFAULT: FINAL
/
CREATE OR REPLACE TYPE BODY geo object type IS
MEMBER FUNCTION get name RETURN VARCHAR2
IS BEGIN RETURN name; END;
-- no implementation for set name
-- (to be class-specific)
END;
/
9.4 Objekt-Relationale Konzepte 289
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ERZEUGEN VON SUBTYPEN
CREATE OR REPLACE TYPE water type
UNDER geo object type (
MEMBER FUNCTION bla RETURN NUMBER
-- empty derivation not allowed in current version
)
NOT FINAL
NOT INSTANTIABLE;
/
• + Angabe eines TYPE BODY, der bla implementiert.
9.4 Objekt-Relationale Konzepte 290
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ERZEUGEN VON SUBTYPEN
• finale Klassen fur Meere, Seen und Flusse etc.
• mussen alle bis jetzt nicht implementierten Methodenanbieten
• erfordert OVERRIDING
CREATE OR REPLACE TYPE sea type
UNDER water type (
depth NUMBER,
OVERRIDING
MEMBER FUNCTION set name RETURN VARCHAR2,
[OVERRIDING -- optional
MEMBER FUNCTION bla RETURN NUMBER]
)
INSTANTIABLE;
/
• + Angabe eines TYPE BODY, der set name implementiert.
• optional kann man auch bla uberschreiben.
• analog fur Meere, Flusse, Berge, Inseln und Wusten.
9.4 Objekt-Relationale Konzepte 291
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TABELLEN UBER ALLGEMEINEN KLASSEN
• eine Tabelle fur alle geographischen Objekte
CREATE TABLE geo obj OF geo object type;
INSERT INTO geo obj
SELECT sea type(name, depth) FROM sea;
INSERT INTO geo obj
SELECT lake type(name, area) FROM lake;
INSERT INTO geo obj
SELECT river type(name, NULL, NULL, NULL, length)
FROM river;
INSERT INTO geo obj
SELECT mountain type(name, elevation, coordinates)
FROM mountain;
INSERT INTO geo obj
SELECT desert type(name, area) FROM desert;
INSERT INTO geo obj
SELECT island type(name, islands, area, coordinates)
FROM island;
9.4 Objekt-Relationale Konzepte 292
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ANFRAGEN AN TABELLEN UBER ALLGEMEINEN
KLASSEN
• die Tabelle geo obj ist eine Kollektion von Objekten derKlasse geo obj type (abstrakt)
• enthalt Instanzen der finalen Subklassen, z.B. Flusse undBerge.
• Substituierbarkeit:“Ein Objekt eines Typs t kann uberall auftreten, wo einObjekt eines Obertyps von t erwartet wird”
– Zeilenobjekte in Objekttabellen
– Spaltenobjekte (objektwertige Attribute)
– Referenzattribute
– Argumente und Ruckgabewerten von Methoden
• select name from geo obj;da alle geo objects einen Namen haben.
9.4 Objekt-Relationale Konzepte 293
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ANFRAGEN AN KLASSENSPEZIFISCHE
EIGENSCHAFTEN
• Kollektion von Instanzen einer abstrakten Klasse
• Auswahl der Objekte einer speziellen Subklasse
• Verwendung von klassenspezifischen Eigenschaften
• ahnlich wie in C++/Java: Typumwandlungen
SPEZIELLSTE KLASSENZUGEHORIGKEIT
• SYS TYPEID(<object>)ergibt die ID der speziellsten Klasse, zu der ein Objektgehort
• herausfinden des Klassennamens in all types
SELECT type name, typeid, supertype name
FROM all types
WHERE typeid = (SELECT SYS TYPEID(value(x))
FROM geo obj x
WHERE name=’Llullaillaco’);
type name typeid supertype name
mountain 08 geo object
9.4 Objekt-Relationale Konzepte 294
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TYPTESTS
• <object> IS OF(<type>)
testet ob <object> vom Typ <type> ist.
• normalerweise testet man Zugehorigkeit zu einem Subtypdes fur die Tabelle bekannten Typs.
• Ausgeben aller Namen von Bergen:
SELECT x.name
FROM geo obj x
WHERE value(x) IS OF (mountain type);
• wie bekommt man die Namen und die Hohe?
SELECT x.name, x.elevation
ist nicht erlaubt(geo objects haben keine Hohe!)
9.4 Objekt-Relationale Konzepte 295
Praktikum: Datenbankprogrammierung in SQL/ORACLE
TYPUMWANDLUNGEN
• TREAT (<object> AS <type>)
behandelt <object> als eine Instanz des Typs <type>
• falls moglich
• sonst: NULL
SELECT x.name,
(TREAT (value(x) AS mountain type)).elevation
FROM geo obj x
WHERE value(x) IS OF (mountain type);
9.4 Objekt-Relationale Konzepte 296
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.5 Diverses zu Objekttypen
ANDERUNGEN AN OBJEKTTYPEN
Benutzerdefinierte Typen konnen mit ALTER TYPE verandertwerden:
• Hinzunehmen und Loschen von Attributen
• Hinzunehmen und Loschen von Methoden
• Modifikation eines numerischen Attributs (Lange,Prazision)
• VARCHAR kann verlangert werden
• Andern der FINAL- und INSTANTIABLE-Eigenschaften
ALTER TYPE <type>
ADD ATTRIBUTE <name> <datatype>,
DROP ATTRIBUTE <name>,
MODIFY ATTRIBUTE <name> <datatype>,
ADD MEMBER FUNCTION/PROCEDURE <method-spec>
-- dann CREATE TYPE BODY neu machen!
DROP MEMBER FUNCTION/PROCEDURE <method-spec>
<options>
9.5 Objekt-Relationale Konzepte 297
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ANDERUNG VON TYPDEFINITIONEN:ABHANGIGKEITEN
Objekttypen-Definitionen und Referenzattribute erzeugen einenGraphen, der dem von Fremdschlusseldefinitionen erzeugtenahnlich ist.
• Abhangige Schemaobjekte, die einen Typ referenzierensind z.B.:
– Tabellen
– Typen, insb. Subtypen
– PL/SQL: Prozeduren, Funktionen, Trigger
– Views, Objekt-Views
• Veranderungen: ALTER TYPE
• Propagieren von Anderungen: CASCADE
• Compilierbare abhangige Datenbankobjekte (PL/SQL,Sichten, . . . ): INVALIDATEwerden als invalid markiert und bei der nachstenBenutzung neu compiliert.
• Tabellen: neue Attribute werden mit NULLwerten initialisiert.
Die Datenbank muss nach Typveranderungen revalidiertwerden(siehe Handbucher).9.5 Objekt-Relationale Konzepte 298
Praktikum: Datenbankprogrammierung in SQL/ORACLE
INDEXE AUF OBJEKTATTRIBUTEN
Indexe konnen auch auf Objektattributen erstellt werden:
CREATE INDEX <name>
ON <object-table-name>.<attr>[.<attr>]∗;
• Indexe konnen nicht uber komplexen Attributen erstelltwerden:
-- nicht erlaubt:
CREATE INDEX city_index
ON City_ObjTab(coordinates);
• Indexe konnen uber elementare Teilattribute eineskomplexen Attributes erstellt werden:
CREATE INDEX city_index
ON City_ObjTab(coordinates.Latitude,
coordinates.Longitude);
• Funktions-basierte Indexe:
CREATE INDEX name ON
Organization_Obj_Tab (numberOfMembers);
arbeiten mit vorberechneten Werten.
9.5 Objekt-Relationale Konzepte 299
Praktikum: Datenbankprogrammierung in SQL/ORACLE
ZUGRIFFSRECHTE AUF OBJEKTE
Recht an Objekttypen:
GRANT EXECUTE ON <Object-datatype> TO ...
• bei der Benutzung eines Datentyps stehen vor allem dieMethoden (u.a. die entsprechende Konstruktormethode) imVordergrund.
9.5 Objekt-Relationale Konzepte 300
Praktikum: Datenbankprogrammierung in SQL/ORACLE
REFERENTIELLE INTEGRITAT
• Vgl. FOREIGN KEY ... REFERENCES ... ON
DELETE/UPDATE CASCADE
• Veranderungen an Objekten:OID bleibt unverandert→ referentielle Integritat bleibt gewahrt.
• Loschen von Objekten:dangling references moglich.
Uberprufung durch
WHERE <ref-attribute> IS DANGLING
Verwendung z.B. in einem AFTER-Trigger:
UPDATE <table>
SET <attr> = NULL
WHERE <attr> IS DANGLING;
9.5 Objekt-Relationale Konzepte 301
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.6 Object-Views
• maßgeschneiderte Object-Views mit sehr weitgehenderFunktionalitat
Legacy-Datenbanken: Integration bestehender Datenbankenin ein “modernes” objektorientiertes Modell:
Objekt-Views uber relationale Ebene legen:“Objekt-Abstraktionen”
Effizienz + Benutzerfreundlichkeit:Die relationale Reprasentation ist oft effizienter:
• Geschachtelte Tabellen intern als separate Tabellengespeichert.
• n : m-Beziehungen: gegenseitige geschachtelteTabellen notwendig.
⇒ Definition eines relationalen Basisschemas mitObject-Views.
Einfache Modifizierbarkeit: CREATE OR REPLACE TYPE undALTER TYPE nur sehr eingeschrankt
⇒ Veranderungen durch Neudefinition geeigneterObject-Views abfangen.
Haufige Empfehlung: Object Views mit geschachteltenTabellen, Referenzen etc. auf Basis eines relationalenGrundschemas verwenden.9.6 Objekt-Relationale Konzepte 302
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJECT-VIEWS
Benutzer fuhrt seine Anderungen auf dem durch dieObjektviews gegebenen externen Schema durch.
• enthalten Zeilenobjekte, d. h. hier werden neue Objektedefiniert.
• Abbildung direkter Anderungen (INSERT, UPDATE undDELETE) durch INSTEAD OF-Trigger auf dasdarunterliegende Schema.
• Benutzer darf erst gar keine solchen Statements an dasView stellen. Entsprechende Funktionalitat durchMethoden der Objekttypen, die die Anderungen direkt aufden zugrundeliegenden Basistabellen ausfuhren.
Syntax
• durch WITH OBJECT OID <attr-list> wird angegeben,wie die Objekt-ID berechnet wird werden soll.
• Verwendung von CAST und MULTISET.
CREATE [OR REPLACE] VIEW <name> OF <type>
WITH OBJECT OID (<attr-list>)
AS <select-statement>;
• in <select-statement> wird kein Objektkonstruktorverwendet!
9.6 Objekt-Relationale Konzepte 303
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJECT VIEWS: Country
CREATE OR REPLACE TYPE Country_Type AS OBJECT
(Name VARCHAR2(50),
Code VARCHAR2(4),
Capital REF City_Type,
Area NUMBER,
Population NUMBER);
/
Sinnvollerweise wurde man hier gleich auch noch Methodendefinieren.
CREATE OR REPLACE VIEW Country ObjV OF Country Type
WITH OBJECT OID (Code)
AS
SELECT Country.Name, Country.Code, REF(cty),
Area, Country.Population
FROM Country, City ObjTab cty
WHERE cty.Name = Country.Capital
AND cty.Province = Country.Province
AND cty.Country = Country.Code;
SELECT Name, Code, c.capital.name, Area, Population
FROM Country ObjV c;
9.6 Objekt-Relationale Konzepte 304
Praktikum: Datenbankprogrammierung in SQL/ORACLE
OBJECT VIEWS: WAS NICHT GEHT
• Object View darf keine geschachtelte Tabelle und
• kein Ergebnis einer funktionalen Methode einerzugrundeliegenden Tabelle enthalten.
Object View auf Basis von Organization ObjTab:
CREATE OR REPLACE TYPE Organization Ext Type AS OBJECT
(Name VARCHAR2(80),
Abbrev VARCHAR2(12),
Members Member List Type,
established DATE,
hasHqIn REF City Type,
numberOfPeople NUMBER);
/
CREATE OR REPLACE VIEW Organization ObjV
OF Organization Ext Type
AS
SELECT Name, Abbrev, Members, established,
hasHqIn, org.people()
FROM Organization ObjTab org;
FEHLER in Zeile 3:
ORA-00932: nicht ubereinstimmende Datentypen
Beide angegebenen Attribute sind auch einzeln nicht erlaubt.
9.6 Objekt-Relationale Konzepte 305
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.7 Objektorientierung und DataDictionary
• TABS = USER TABLES(table name, ...): alle relationalenTabellen die dem Benutzer gehoren
• USER OBJECT TABLES(table name, table type,nested...): alle Objekttabellen die dem Benutzer gehoren.table type gibt den Objekttyp an, aus dessen Instanzendie Tabelle besteht. Hierzu gehoren auch Nested Tables!
• USER ALL TABLES(table name, ...): alle Tabellen die demBenutzer gehoren.
• USER OBJECTS(object name, object type, status): alleDatenbankobjekte, die dem Benutzer gehoren.
• Objekttabellen, deren Type mit DROP TYPE ... FORCEgeloscht wurde, stehen nicht mehr inUSER OBJECT TABLES. Sie existieren aber noch (neuesCREATE TABLE ergibt eine Fehlermeldung).(Bsp. nachste Folie)
• USER TYPES(type name): alle Objekttypen, die demBenutzer gehoren.
9.7 Objekt-Relationale Konzepte 306
Praktikum: Datenbankprogrammierung in SQL/ORACLE
Loschen von Datenbankobjekten
CREATE TYPE bla AS OBJECT (x NUMBER);
/
CREATE TABLE blatab OF bla;
SELECT table_name, table_type FROM user_object_tables;
-- name: blatab, type: bla
DROP TYPE bla FORCE;
SELECT table_name, table_type FROM user_object_tables;
-- nichts
CREATE TYPE bla AS OBJECT (x NUMBER);
/
CREATE TABLE blatab OF bla;
-- ORA-00955: name is already used by an existing object
SELECT * FROM user_objects WHERE object_name=’BLATAB’;
-- blatab - invalid
SELECT object_name, object_type, status from user_objects;
SELECT object_name, object_type, status from user_objects
WHERE object_type = ’TABLE’;
Problem: alle Tabellen loschen (Skript drop-all-tables)
• Verwendung von user tables ignoriert invalide Tabellen.
• Nested Tables konnen nicht mit DROP TABLE geloschtwerden, sondern nur mit der Tabelle zu der sie gehoren.
• Verwendung von user objects where object type = ’TABLE’bricht ab, wenn es eine (moglicherweise invalide, also inuser object tables auch nicht mehr als nested gelistete)Nested Table loschen soll.
9.7 Objekt-Relationale Konzepte 307
Praktikum: Datenbankprogrammierung in SQL/ORACLE
9.8 Fazit
• Objektrelationale Tabellen (Folie 242):Kompatibilitat mit den grundlegenden Konzepten von SQL.U.a. Fremdschlusselbedingungen von objektrelationalenTabellen zu relationalen Tabellen.
• Objektorientiertes Modell (Folie 268):... etwas kompliziert zu handhaben.
• Object/Objekt-Relationale Views (Folie 302):erlauben ein objektorientiertes externes Schema.Benutzer-Interaktionen werden durch Methoden undINSTEAD OF-Trigger auf das interne Schema umgesetzt.Implementierung auf relationaler Basis.
• Objekttypen-Konzept als Basis fur (vordefinierte, in Javaimplementierte Klassen als) Datentypen zur Behandlungvon nicht-atomaren Werten (XML (siehe Folie 384),Multimedia etc.).
9.8 Objekt-Relationale Konzepte 308
Top Related