summaryrefslogtreecommitdiffstats
path: root/Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql
blob: bef07fcbfe2d9a47eb3a0197ba329e137d9c93fd (plain)
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
*/