1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/* 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
*/
|