/* Dieses Skript enthält alle Deklarationen der Types zum Vorlesungsbeispiel, Kapitel 7, sowie die Deklarationen der beiden Tabellen T_Kunde und T_Auftrag und des Methodenrumpfes der Methode Last_Bestellung() */ -- Die Generierung der Types ************************* CREATE TYPE Typ_Adresse AS OBJECT ( plz NUMBER(5), ort VARCHAR2(20), strasse VARCHAR2(20), hausnr VARCHAR2(5) ); / CREATE TYPE Typ_Kontakt AS TABLE OF VARCHAR2(20); / CREATE TYPE Typ_Telefon AS VARRAY(3) OF VARCHAR2(20); / -- Vorwärtsdeklaration Typ_Auftrag CREATE TYPE Typ_Auftrag; / CREATE TYPE Typ_AuftragTab AS TABLE OF REF Typ_Auftrag; / -- typ_kunde mit Methode + -- Auftragsreferenzen CREATE TYPE Typ_Kunde AS OBJECT ( KNr INTEGER, Name VARCHAR2(20), Adresse Typ_Adresse, Telefon Typ_Telefon, Kontakt Typ_Kontakt, RefAuftrag Typ_AuftragTab, MEMBER FUNCTION Last_Bestellung RETURN date ); / CREATE TYPE Typ_Auftrag AS OBJECT ( ANr INTEGER, Eingang DATE, Bearb DATE, RefKunde REF Typ_Kunde ); / -- Methodenrumpf zur Methode Last_Bestellung /* - Der Methodenrumpf arbeitet ausschliesslich mit Attributen des Types Typ_Kunde, die Deklaration ist also insbesondere unabhängig von der Deklaration der Tabelle T_Kunde (und erst recht von der Deklaration der Tabelle T_Auftrag) - Die Ermittlung des maximalen Eingangsdatums erfordert ausschliesslich ein Lesen der Einträge in der nested table RefAuftrag des aktuellen Kundenobjektes self. */ CREATE OR REPLACE TYPE BODY Typ_Kunde AS MEMBER FUNCTION Last_Bestellung RETURN date is lastdate date; BEGIN SELECT MAX(a.column_value.Eingang) INTO lastdate FROM table(self.RefAuftrag) a; RETURN lastdate; END; END; / -- Die Generierung der beiden Tabellen ******************* CREATE TABLE T_Auftrag OF Typ_Auftrag ( ANr primary key); CREATE TABLE T_Kunde OF Typ_Kunde( KNr primary key) NESTED TABLE Kontakt STORE AS Kunde_Kontakt_Liste, NESTED TABLE RefAuftrag STORE AS Kunde_Auftrag_Liste; /* Objekte, die als Instanzen dieser beiden Tabellen verwaltet werden, sind Objekt-ADTs und können über OIDs referenziert werden, Objekte, die nur als Wert eines anderen Objektes auftauchen, wie z.B. die Adress-Objekte in den Kunden-Objekten, sind Werte-ADTs */