4. Objektrelationales Typsystem Objekttypen Strukturierte Objekttypen Der Typ t approxmatch row des letzten Beispiels ist ein sogenannter Objekttyp. Definition: Ein Objekttyp ist ein Datentyp, bei dem (u.U. verschiedene) bekannte Datentypen zu einem neuen Datentyp zusammengefasst werden. • Der Einsatz eines Objekttyps bietet sich an, wenn auf strukturierte Werte überwiegend als Ganzes zugegriffen wird. • Insbesondere wird so Konsistenz im Datenbankschema für die einzelnen Attribute (bzw. Instanzvariablen) des Objekttyps hergestellt. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 170 4. Objektrelationales Typsystem Objekttypen Definition eines Objekttyps Ähnlich einer Tabellendefinition: CREATE TYPE objekttyp AS OBJECT ( attribut1 datentyp1 , ... attributN datentypN ); / • Die Vereinbarung eines Objekttyps ist in Oracle stets eine PL/SQL-Anweisung! • Daher im Beispiel das “/”. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 171 4. Objektrelationales Typsystem Objekttypen Löschen von Typdefinitionen • Gegenstück zu CREATE TYPE ist: DROP TYPE objekttyp [FORCE] • FORCE ermöglicht ein Löschen, obwohl abhängige Datenbankobjekte existieren. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 172 4. Objektrelationales Typsystem Objekttypen Beispiel: Objekttyp für Adressen create type t_anschrift as object ( strasse varchar2(50), hausnr varchar2(4), plz char(5), ort varchar2(30) ); create table kunden ( k_nr number(6) primary key, k_name varchar2(50) not null, k_anschrift t_anschrift not null ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 173 4. Objektrelationales Typsystem Objekttypen Constraints • Bei der Typdefinition können keine Constraints für die Attribute definiert werden. • Bei Tabellendefinition sind Constraints wie üblich mit Hilfe von CHECK definierbar. • Man beachte: NOT NULL bei einem Relationsattribut mit Objekttyp vehindert nicht, dass die Instanzattribute den Wert NULL annehmen können! CREATE TABLE kunden ( ... CONSTRAINT CHECK (k_anschrift.strasse IS NOT NULL AND ...) ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 174 4. Objektrelationales Typsystem Objekttypen Beispiel: Verschachtelte Objekttypen create type Point2D as object ( x number, y number ); create type Box2D as object ( lowleft Point2D, upright Point2D ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 175 4. Objektrelationales Typsystem Objekttypen Optionen bei der Typdefinition • NOT INSTANTIABLE entspricht einem abstrakten Typ, es wird kein Konstruktor zur Verfügung gestellt • NOT FINAL es besteht die Möglichkeit, Untertypen zu definieren • Standard: INSTANTIABLE und FINAL • Man beachte den Unterschied zu Java bei FINAL. Beispiel: CREATE TYPE t_adress AS OBJECT ( ... ) NOT INSTANTIABLE NOT FINAL; CREATE TYPE t_USadress UNDER t_adress ( ... ); CREATE TYPE t_DEadress UNDER t_adress ( ... ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 176 4. Objektrelationales Typsystem Objekttypen Instanziierung von Objekttypen • Wenn instantiable, dann steht ein Konstruktor mit passender Stelligkeit zur Verfügung. • Bei Nutzung geschachtelter Objekttypen sind natürlich auch die Konstruktoren zu schachteln. insert into kunden values ( 4711, ’Paul Paulsen’, t_anschrift(’Paulsplatz’, ’17a’, ’77777’, ’Paulsheim’) ); insert into boxes values ( 4712, Box2D( Point2D(1,1), Point2D(2,3) ) ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 177 4. Objektrelationales Typsystem Objekttypen Nutzung in SQL und PL/SQL • Auf die einzelnen Attribute eines Objekttyps wird mit der Punkt-Notation zugegriffen. • Sowohl in SQL als auch in PL/SQL möglich. select k_name, k_anschrift.ort from kunden where k_anschrift.plz like ’53%’ • Bei mehrfacher Verschachtelung setzt sich dies entsprechend fort. select box.lowleft.x, box.lowleft.y, box.upright.x, box.upright.y from boxes where box_id = 4712 Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 178 4. Objektrelationales Typsystem Objekttypen Vergleichsoperatoren • Für ganze Objekte stehen die Vergleichsoperatoren = und <> zur Verfügung. • Vergleich erfolgt komponentenweise, Wildcards sind nicht möglich • Definition spezialisierter Vergleichs- und Ordnungsmethoden möglich (später mehr) select box_id from boxes where lowleft = Point2D(1,1) Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 179 4. Objektrelationales Typsystem Objekttypen Indexdefinitionen • Indexdefinitionen auf Attributen eines Objekttyps innerhalb einer Tabelle sind möglich. create index kunden_plz_index on kunden(k_anschrift.plz); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 180 4. Objektrelationales Typsystem Objekttypen Methoden-Deklaration (1) • Neben Attributen können für einen Objekttyp Methoden definiert werden. • Hierbei wird zwischen Methoden mit Rückgabe (MEMBER FUNCTION) und ohne Rückgabe eines Ergebnisses (MEMBER PROCEDURE) unterschieden. • Bei der Typdefinition wird nur das Interface bzw. die Signatur für die Methoden angegeben, keine Implementierung. • Die Implementierung erfolgt in einer separaten Definition: CREATE TYPE BODY Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 181 4. Objektrelationales Typsystem Objekttypen Methoden-Deklaration (2) Allgemeiner Aufbau: CREATE TYPE typname AS OBJECT ( attribut1 datentyp1 , ... attributN datentypN , MEMBER PROCEDURE methodenname(argument1, ...) , ... MEMBER FUNCTION methodenname(argument1, ...) RETURN datentyp , ... ); Hinweis: Bei parameterlosen Methoden werden bei Deklaration (und Definition) keine Klammern verwendet, beim Aufruf sind aber Klammern notwendig. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 182 4. Objektrelationales Typsystem Objekttypen Beispiel: CREATE TYPE Box2d AS OBJECT ( lowleft Point2d, upright Point2d, MEMBER FUNCTION flaeche RETURN number ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 183 4. Objektrelationales Typsystem Objekttypen Methoden-Implementierung • Die Implementierung erfolgt mit Hilfe einer CREATE TYPE BODY Anweisung. • In der Anweisung wird die Signatur der Methoden wiederholt. • Hinter AS oder IS schließt sich dann die Implementierung als PL/SQL-Block (BEGIN ... END;) an. • Die CREATE TYPE BODY Anweisung wird insgesamt auch mit einem END abgeschlossen. • Innerhalb der Implementierungblöcke haben wir mit Hilfe von SELF Zugriff auf das Objekt, für das eine Methode aufgerufen wurde. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 184 4. Objektrelationales Typsystem Objekttypen CREATE TYPE BODY typname AS MEMBER PROCEDURE methodenname(argument1, ...) AS lokale Variablen ... BEGIN PL/SQL-Anweisungen ... END; MEMBER FUNCTION methodenname(argument1, ...) RETURN datentyp AS lokale Variablen ... BEGIN PL/SQL-Anweisungen ... RETURN Wert ; END; END; ☞ Beispiele Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 185 4. Objektrelationales Typsystem Objekttypen Nutzung der Methoden • Mit der üblichen Punkt-Notation innerhalb von SQL- und PL/SQL-Anweisungen. select b.box_id, b.box_box.flaeche() from boxes b where b.box_box.flaeche() > 2 Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 186 4. Objektrelationales Typsystem Objekttypen Klassenmethoden • Neben Instanzmethoden besteht auch die Möglichkeit Klassenmethoden zu deklarieren und definieren. • Solche Methoden werden mit dem Schlüsselwort STATIC statt mit MEMBER versehen, sowohl innerhalb von CREATE TYPE als auch von CREATE TYPE BODY. • Klassenattribute werden nicht unterstützt. STATIC FUNCTION funktionsname(argument1, ...) RETURN datentyp STATIC PROCEDURE funktionsname(argument1, ...) RETURN datentyp CREATE TYPE Point2d AS OBJECT ( ... STATIC FUNCTION ursprung RETURN Point2d ); Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 187 4. Objektrelationales Typsystem Objekttypen CREATE TYPE BODY Point2d AS ... STATIC FUNCTION ursprung RETURN Point2d IS BEGIN RETURN Point2d(0,0); END; END; Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 188 4. Objektrelationales Typsystem Objekttypen Zusätzliche Konstruktoren • Neben dem Standardkonstruktor können weitere Konstruktoren mit anderen Signaturen definiert werden. • Konstruktormethoden werden mit dem Schlüsselwort CONSTRUCTOR FUNCTION eingeleitet. • Es wird auch ein Methodenname verlangt, er muss mit dem Typnamen identisch sein. • Als Rückgabetyp muss SELF AS RESULT angegeben werden. • In der Implementierung wird mittels SELF der passende Zustand hergestellt. • Für RETURN wird kein Wert angegeben. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 189 4. Objektrelationales Typsystem Objekttypen Map-Funktion • Eine Map-Funktion dient dazu, zusätzliche Vergleichsoperatoren zur Verfügung zu stellen. • Die Map-Funktion bildet ein Objekt auf einen Wert vom Typ Zahl, String oder Datum ab. • Für den Vergleich wird dann der Wert genutzt. • Für t1, t2 ∈ T gilt t1 < t2 gdw. map(t1 ) < map(t2 ). • Die Map-Funktion ist eine parameterlose MEMBER FUNCTION, die zusätzlich mit dem Schlüsselwort MAP versehen wird. MAP MEMBER FUNCTION funktionsname RETURN typ ☞ Beispiel Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 190 4. Objektrelationales Typsystem Objekttypen Order-Funktion • Alternativ zu einer Map-Funktion kann auch eine Order-Funktion definiert werden (aber nicht beide). • Die Order-Funktion ist flexibler: Für zwei Objekte wird ein Vergleich durchgeführt. • Vergleich: SELF mit Parameter OBJ • Ergebis: -1, falls SELF ≤ OBJ, sonst 1 ☞ Beispiel Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, SS 2010 191