Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  1/2010  Pfeil  Datenbanken
suche: 
Dieser Artikel richtet sich an Entscheider, Software-Architekten sowie Entwickler, die sich mit Objektorientierung in Oracle vertraut machen wollen.

Glossar

O-/R-Mapping
Object-Relational-Mapping. O-/R-Mapping bezeichnet die Abbildung von objektorientierten Daten auf relationale Daten und umgekehrt.
OVERLOADING
Speicherung von gleich benannten Funktionen oder Prozeduren innerhalb der Datenbank, die sich nur in Anzahl, Reihenfolge und/oder Datentyp unterscheiden.
Package
Stellt eine Sammlung logisch zusammengehöriger Funktionalitäten (Prozeduren, Funktionen, Typdeklarationen, ...) dar.
PL/SQL
Procedural Language/Structured Query Language. Erweiterung der Abfragesprache SQL um prozedurale Programmierelemente.
STATIC
Mit dem Schlüsselwort STATIC kann eine Methode in der Programmiersprache Java als eine Klassenmethode deklariert werden. Das Besondere an einer Klassenmethode ist, dass diese zu einer Klasse und nicht zu einem Objekt gehört. Außerdem ist im Speicher immer nur eine Kopie einer Klassenmethode vorhanden.
Titelbild



Objektorientierung in Oracle


Die Vorteile der objektorientierten Softwareentwicklung gegenüber der konventionellen, prozeduralen Programmierung ist nicht nur in der Fachliteratur, sondern auch in der Praxis anerkannt. Folglich bieten viele Entwicklersysteme, die in den letzten Jahren vermarktet wurden, die Möglichkeit der objektorientierten Programmierung. Wie sieht es mit der Objektorientierung in Oracle aus? Dieser Artikel gibt einen Einstieg, wie mit der Datenbankprogrammiersprache PL/SQL objektorientiert entwickelt werden kann. Dabei werden die Besonderheiten der Objektorientierung in Oracle aber auch die Möglichkeiten der Speicherung der Objekte in einer Datenbank vorgestellt.

Abb. 1: Struktur eines Objekttyps.
Abb. 1: Struktur eines Objekttyps. Vergrößern
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;
Abb. 2: Objekttyp KUNDE anlegen.
Abb. 3: Speicherung der Objekte in der Datenbank.
Abb. 3: Speicherung der Objekte in der Datenbank. Vergrößern
DECLARE
  kundeObj KUNDE;
BEGIN
  SELECT VALUE(k) INTO kundeObj
  FROM kunde_tbl k WHERE k.nr = 5;
END;
/
Abb. 4: Auslesen eines Objekts aus einer Objekttabelle mit Hilfe der Funktion VALUE.
ALTER TYPE kunde ADD ATTRIBUTE (
  strasse VARCHAR2(50)
) CASCADE;
Abb. 5: Objekttyp KUNDE wird um ein Attribut STRASSE erweitert.
Abb. 6: Darstellung einer Referenz zwischen Objekttabellen.
Abb. 6: Darstellung einer Referenz zwischen Objekttabellen. Vergrößern
CREATE TYPE BODY kunde AS
  MAP MEMBER FUNCTION f_sort RETURN NUMBER IS
  BEGIN
    RETURN nr;
  END f_sort;
END;
/
Abb. 7: Beispiel einer MAP-Funktion.
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;
/
Abb. 8: Beispiel einer ORDER-Funktion.
Abb. 9: Funktionsweise von Object Views.
Abb. 9: Funktionsweise von Object Views. Vergrößern

Einführung und Motivation

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.

Objekttypen versus Klasse

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.

Objekttypspezifikation

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.

Objekttyprumpf

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).

STATIC- und MEMBER-Methoden

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.

Sichtbarkeit von Attributen und Methoden

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.

Speicherung der Objekte in der Datenbank

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).

Type-Evolution

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).

REF-Spalten

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).

Objektorientierte Konzepte

Des Weiteren werden in Oracle ähnlich wie bei den verbreiteten objektorientierten Programmiersprachen alle herkömmlichen objektorientierten Konzepte unterstützt. Dazu gehören unter anderem:

Sortierung von Objekten

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.

Object Views

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.

Performance

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.

Zusammenfassung

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).