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
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
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
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
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
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
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
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
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
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
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
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
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
Beispiel: CREATE TYPE Box2d AS OBJECT ( lowleft Point2d, upright Point2d, MEMBER FUNCTION flaeche RETURN number ); Objektrelationale Datenbanksysteme Hochschule Bonn-Rhein-Sieg, SS 2010 183
Methoden-Implementierung Die Implementierung erfolgt mit Hilfe einer CREATE TYPE BODY Anweisung. In der Anweisung wird die Signatur der Methoden wiederholt. HinterAS oderis 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
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
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
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
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
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
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 t 1, t 2 T gilt t 1 < t 2 gdw. map(t 1 ) < map(t 2 ). Die Map-Funktion ist eine parameterlosemember 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
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