CREATE TYPE kunde( nr NUMBER(9), name VARCHAR2(25), ort VARCHAR2(30), MEMBER FUNCTION getName RETURN VARCHAR2, MEMBER PROCEDURE setName(name IN VARCHAR2) ); / CREATE TYPE BODY kunde AS MEMBER FUNCTION getName RETURN VARCHAR2 AS BEGIN RETURN name; END getName; MEMBER PROCEDURE setName(name IN VARCHAR2) IS BEGIN SELF.name := name; END setName; END;
DECLARE kundeObj KUNDE; BEGIN SELECT VALUE(k) INTO kundeObj FROM kunde_tbl k WHERE k.nr = 5; END; /
ALTER TYPE kunde ADD ATTRIBUTE ( strasse VARCHAR2(50) ) CASCADE;
CREATE TYPE BODY kunde AS MAP MEMBER FUNCTION f_sort RETURN NUMBER IS BEGIN RETURN nr; END f_sort; END; /
CREATE TYPE BODY kunde AS ORDER MEMBER FUNCTION f_sort(p_kunde kunde) RETURN NUMBER IS BEGIN IF nr<p_kunde.nr THEN RETURN -1; ELSIF nr>p_kunde.nr THEN RETURN 1; ELSE RETURN 0; END IF; END f_sort ; END; /
Mit der objektorientierten Softwareentwicklung lassen sich komplexe Problemstellungen übersichtlich abbilden. Diese Vorgehensweise bietet gegenüber der konventionellen, prozeduralen Programmierung wesentliche Vorteile:
Mit der Version 8 hat Oracle einige objektorientierte Konzepte eingeführt, die mit den folgenden Versionen immer weiter ausgebaut und vervollständigt wurden. Diese objektorientierten Konzepte werden in den folgenden Abschnitten kurz vorgestellt.
Objektorientierung unter Oracle orientiert sich einerseits an dem Package-Konzept (siehe Abbildung 1) aus PL/SQL und andererseits an objektorientierten Programmiersprachen wie Java.
Die Basis bilden die Objekttypen unter Oracle. Ein Objekttyp ist ein benutzerdefinierter Datentyp und besteht aus einem Namen, mehreren Attributen und den dazugehörigen Methoden.
Eine Methode kann entweder eine Prozedur oder eine Funktion sein. Sie kann auf die Attribute des zugehörigen Objekttyps zugreifen und diese verändern.
Die Attribute und Methoden eines Objekttyps werden, ähnlich einem PL/SQL-Paket, in einer Spezifikation (Objekttypspezifikation) deklariert. Die Spezifikation ist eine öffentliche Schnittstelle und kann von anderen Programmen aufgerufen werden.
Die Implementierungen der in der Spezifikation deklarierten Prozeduren bzw. Funktionen befinden sich im Body (Objekttyprumpf). Dabei muss jede im Body implementierte Prozedur bzw. Funktion auch in der Spezifikation deklariert werden.
Diese Einschränkung stellt einen Unterschied zu PL/SQL-Paketen dar. Denn hier können Prozeduren und Funktionen in einem Paket- Body implementiert werden, ohne diese in der Paket-Spezifikation deklarieren und somit nach außen sichtbar machen zu müssen.
Darüber hinaus können in einem Objekttyp-Body keine zusätzlichen Variablen deklariert werden. Auch diese Einschränkung stellt einen Unterschied zum PL/SQL Paket-Paradigma dar (siehe Abbildung 2).
Bei den Methoden wird grundsätzlich zwischen der STATIC- und der MEMBER-Methode unterschieden. Ähnlich der anderen objektorientierten Programmiersprachen wird die STATIC-Methode unabhängig von Objekten aufgerufen.
Eine MEMBER-Methode wird dagegen nur im Zusammenhang mit einem Objekt aufgerufen. Sie verfügt über einen impliziten SELF-Parameter. Ein SELF-Parameter ist eine Referenz auf das Objekt selbst und kann innerhalb von MEMBER-Methoden verwendet werden.
Eine Besonderheit der Objektorientierung in Oracle gegenüber anderen objektorientierten Programmiersprachen ist die Tatsache, dass in Oracle keine Unterscheidung von privaten (PRIVATE) und öffentlichen (PUBLIC) Attributen und Methoden vorhanden ist.
In PL/SQL kann also direkt, d. h. ohne öffentliche Methoden, auf die Attribute eines Objekts zugegriffen werden.
In einer Oracle Datenbank können Objekte sowohl als Spalten innerhalb einer relationalen Tabelle, als auch in einer so genannten Objekttabelle (object tables) gespeichert werden. Eine Objekttabelle beinhaltet in einer Zeile ein Objekt eines vorgegebenen Objekttyps. Eine Spalte entspricht dabei einem Attribut eines Objekts (siehe Abbildung 3). Ein wesentlicher Vorteil von Objekttabellen gegenüber der Speicherung von Objekten als Spalte (relationale Tabelle) ist, dass auf Objekte in einer Objekttabelle referenziert werden kann (siehe REF-Spalten).
Der Zugriff und die Änderung der Daten einer Objekttabelle erfolgt wie bei einer herkömmlichen relationalen Tabelle. Wird allerdings statt der einzelnen Attribute ein Objekt benötigt, so kann mit der Funktion VALUE ein gesamtes Objekt ausgelesen werden (siehe Abbildung 4).
Sollen bereits vorhandene Objekttypen geändert werden, so kann dies mit Hilfe der so genannten Type-Evolution vorgenommen werden. Mit der Type-Evolution stellt Oracle eine Funktionalität zur Verfügung, mit der Objekttypen trotz abhängiger Datenbankobjekte, wie z. B. andere Objekttypen oder sogar Objekttabellen mit Objekten basierend auf dem Objekttyp selbst, modifiziert werden können.
Dabei können die Änderungen wie z. B. das Hinzufügen von neuen Attributen, das Löschen von bereits vorhandenen Attributen oder das Vergrößern der Länge einzelner Datentypen der Attribute, entweder unmittelbar oder zeitverzögert propagiert werden (siehe Abbildung 5).
Eine weitere Besonderheit der Objektorientierung in Oracle stellen die REF-Spalten dar. In einer REF-Spalte kann eine Referenz auf ein Objekt aus einer Objekttabelle gespeichert werden. Eine Objektreferenz ist dabei ein in der gesamten Datenbank eindeutiger Objektidentifizierer (Object identifier, OID).
Der Vorteil der REF-Spalte kommt immer dann zum Tragen, wenn statt des gesamten Objektes lediglich nur eine Objektreferenz gespeichert werden soll (siehe Abbildung 6).
Des Weiteren werden in Oracle ähnlich wie bei den verbreiteten objektorientierten Programmiersprachen alle herkömmlichen objektorientierten Konzepte unterstützt. Dazu gehören unter anderem:
Soll auf Objekte, die in der Datenbank gespeichert sind, eine Sortierung in einem SELECT Statement oder eine Überprüfung auf Gleichheit von Objekten vorgenommen werden, so muss entweder eine MAP- oder eine ORDER-Methode implementiert werden.
Durch die Verwendung der MAP-Methode werden alle Objekte eines Objekttyps in skalare Datentypen umgewandelt und anschließend sortiert (siehe Abbildung 7).
Eine ORDER-Methode wird dagegen mehrfach aufgerufen, da mit der ORDER-Methode immer nur zwei Objekte verglichen werden können (siehe Abbildung 8).
Wird eine große Anzahl von Objekten sortiert, so ist die MAP-Methode zu empfehlen.
Mit Hilfe der so genannten Object Views ist eine objektorientierte Sicht auf relationale Daten möglich. Dabei können Object Views entweder auf relationalen Tabellen oder auch auf Objekttabellen basieren (siehe Abbildung 9).
Object Views können z. B. dann verwendet werden, wenn eine objektorientierte Softwareentwicklung auf bereits vorhandenen relationalen Daten realisiert werden soll.
Zum Thema Performance ist grundsätzlich zu sagen, dass die Objekttabellen die gleichen Möglichkeiten der Performance-Steigerung bieten, wie die relationale Tabelle auch.
Es ist allerdings zu beobachten, dass der Zugriff auf eine Objekttabelle mit dem standardmäßig, systemgenerierten OID langsamer ist, als ein Zugriff auf eine Objekttabelle mit einem auf dem Primärschlüssel basierenden OID.
Der Grund hierfür liegt darin, dass die Objekttabellen mit dem systemgenerierten OID zusätzlich zu den Attributspalten noch über eine OID-Spalte (16 Byte) verfügen und somit mehr Speicherplatz belegen, als Objekttabellen mit einem auf dem Primärschlüssel basierenden OID.
Die Objektorientierung in Oracle kann als eine Alternative zu der herkömmlichen prozeduralen Programmierweise verstanden werden. Da die wesentlichen Vorteile der Objektorientierung in der Wiederverwendbarkeit und Verbesserung der Wartbarkeit liegen, können hier langfristige Kosteneinsparungen erzielt werden. Zudem kann der Arbeitsaufwand signifikant minimiert werden.
Kritisch sind hier allerdings die fehlende Unterstützung der Zugriffsmodifikatoren und damit auch die fehlende Unterstützung von Information Hiding. Da in Oracle zwischen privaten und öffentlichen Attributen nicht unterschieden werden kann, können alle Objektattribute ohne Verwendung der Objektmethoden verändert werden.
Die direkte Möglichkeit der Speicherung der Objekte in einer Objekttabelle stellt auf der anderen Seite aber einen deutlichen Performance-Vorteil gegenüber anderen objektorientierten Programmiersprachen dar, bei denen ein explizites Mapping zwischen Objekten und Tabellen notwendig ist.
Eine Vertiefung zu diesem Thema bietet Ihnen unser 5-tägiges Seminar "Objektorientierung in Oracle“.
Markus Fiegler (info@ordix.de).