diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Bachelor/Datenbanken 2/Praktikum5 | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Bachelor/Datenbanken 2/Praktikum5')
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf | bin | 0 -> 143675 bytes | |||
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/ORDML.sql | 61 | ||||
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql | 82 | ||||
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql | 119 | ||||
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql | 65 | ||||
| -rw-r--r-- | Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg | bin | 0 -> 24153 bytes |
6 files changed, 327 insertions, 0 deletions
diff --git a/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf b/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf Binary files differnew file mode 100644 index 0000000..6b5ad37 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf diff --git a/Bachelor/Datenbanken 2/Praktikum5/ORDML.sql b/Bachelor/Datenbanken 2/Praktikum5/ORDML.sql new file mode 100644 index 0000000..20a685b --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/ORDML.sql @@ -0,0 +1,61 @@ +/* Dieses Skript enthält alle INSERTS und UPDATES
+ zum Anlegen zweier Kunden und zweier Aufträge,
+ die sich gegenseitig referenzieren (Bsp. Kapitel 7).
+ Basis hierfür sind die Types aus dem Skript
+ ORTypes.sql
+*/
+-- Kunde 1 (ohne Auftragsreferenzen)
+INSERT INTO T_Kunde (KNr,Name,Adresse,Telefon,Kontakt)
+VALUES (10,'Schmidt',
+ Typ_Adresse(64295,'DA','X-Str.','45'),
+ Typ_Telefon('111','222',NULL),
+ Typ_Kontakt('Kontaktmann 5','Kontaktmann 6')
+ );
+
+-- Kunde 2 (ohne Auftragsreferenzen)
+INSERT INTO T_Kunde (KNr,Name,Adresse,Telefon,Kontakt)
+VALUES (20,'Huber',
+ Typ_Adresse(60433,'FFM','Y-Str.','56'),
+ Typ_Telefon('333','NULL',NULL),
+ Typ_Kontakt('Person 1','Person 2','Person 3')
+ );
+
+-- Auftrag 1 (ohne Kundenreferenz)
+INSERT INTO T_Auftrag (ANr,Eingang,Bearb)
+VALUES (101,'24.05.2005','24.05.2005');
+
+-- Auftrag 2 (ohne Kundenreferenz)
+INSERT INTO T_Auftrag (ANr,Eingang,Bearb)
+VALUES (102,'31.05.2005','31.05.2005');
+
+-- Kundenreferenzen in Auftragsobjekte eintragen
+UPDATE T_Auftrag a
+SET a.RefKunde = (SELECT REF(k)
+ FROM T_Kunde k
+ WHERE k.KNr = 10)
+WHERE a.Anr = 101;
+
+UPDATE T_Auftrag a
+SET a.RefKunde = (SELECT REF(k)
+ FROM T_Kunde k
+ WHERE k.KNr = 20)
+WHERE a.Anr = 102;
+
+-- Tabelle der Auftragsreferenzen in Kundenobjekte eintragen
+UPDATE T_Kunde k
+SET k.RefAuftrag = CAST(MULTISET
+ (SELECT REF(a)
+ FROM T_Auftrag a
+ WHERE a.RefKunde.knr = 10) AS Typ_Auftragtab)
+WHERE k.knr = 10;
+
+UPDATE T_Kunde k
+SET k.RefAuftrag = CAST(MULTISET
+ (SELECT REF(a)
+ FROM T_Auftrag a
+ WHERE a.RefKunde.knr = 20) AS Typ_Auftragtab)
+WHERE k.knr = 20;
+
+-- Verwendung der Methode Last_Bestellung als Spaltenfunktion
+select k.KNr, k.Last_Bestellung()
+from T_Kunde k;
diff --git a/Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql b/Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql new file mode 100644 index 0000000..fb0c6e4 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql @@ -0,0 +1,82 @@ +-- Firma 1 (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (123,'A-Firma',
+ Typ_Adresse(65432,'A-Stadt','B-Weg','17'),
+ 150
+ );
+-- Firma 1a (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (124,'A1-Firma',
+ Typ_Adresse(76543,'B-Stadt','C-Str','25'),
+ 20
+ );
+-- Firma 1b (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (125,'A2-Firma',
+ Typ_Adresse(87654,'C-Stadt','D-Weg','33'),
+ 30
+ );
+
+-- Firma 2 (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (234,'B-Firma',
+ Typ_Adresse(12345,'Z-Stadt','X-Str','87'),
+ 100
+ );
+-- Firma 2a (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (235,'B1-Firma',
+ Typ_Adresse(23456,'Y-Stadt','Y-Weg','92'),
+ 10
+ );
+
+-- Firma 3 (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (345,'C-Firma',
+ Typ_Adresse(12345,'Z-Stadt','Y-Str','55'),
+ 200
+ );
+-- Firma 3a (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (346,'C1-Firma',
+ Typ_Adresse(76543,'B-Stadt','D-Str','88'),
+ 135
+ );
+-- Firma 3b (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (347,'C2-Firma',
+ Typ_Adresse(12345,'Z-Stadt','X-Weg','66'),
+ 50
+ );
+-- Firma 3c (ohne Firmenreferenzen)
+INSERT INTO T_Firma (RegNr,Name,Adresse,Umsatz)
+VALUES (348,'C2-Firma',
+ Typ_Adresse(65432,'A-Stadt','A-Str','12'),
+ 15
+ );
+--
+
+UPDATE T_Firma Subunternehmen f
+SET f.Subunternehmen = CAST ( MULTISET
+ (SELECT REF(f2)
+ FROM T_Firma f2
+ WHERE f2.RegNr = 124 OR f2.RegNr=125)) AS Typ_FirmaTab)
+WHERE RegNr=123;
+
+UPDATE T_Firma Subunternehmen f
+SET f.Subunternehmen = CAST ( MULTISET
+ (SELECT REF(f2)
+ FROM T_Firma f2
+ WHERE f2.RegNr = 235)) AS Typ_FirmaTab)
+WHERE RegNr=234;
+
+UPDATE T_Firma Subunternehmen f
+SET f.Subunternehmen = CAST ( MULTISET
+ (SELECT REF(f2)
+ FROM T_Firma f2
+ WHERE f2.RegNr = 346 OR f2.RegNr=347 OR f2.RegNr=348)) AS Typ_FirmaTab)
+WHERE RegNr=345;
+
+-- Verwendung der Methode Last_Bestellung als Spaltenfunktion
+--select k.KNr, k.Last_Bestellung()
+--from T_Kunde k;
\ No newline at end of file diff --git a/Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql b/Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql new file mode 100644 index 0000000..bef07fc --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql @@ -0,0 +1,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
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql b/Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql new file mode 100644 index 0000000..2e1f8c1 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql @@ -0,0 +1,65 @@ +/*
+*/
+
+-- Die Generierung der Types *************************
+CREATE TYPE Typ_Adresse
+AS OBJECT
+( plz NUMBER(5),
+ ort VARCHAR2(20),
+ strasse VARCHAR2(20),
+ hausnr VARCHAR2(5)
+);
+/
+
+-- Vorwärtsdeklaration Typ_Firma
+CREATE TYPE Typ_Firma;
+/
+
+CREATE TYPE Typ_FirmaTab AS TABLE
+OF REF Typ_Firma;
+/
+
+CREATE TYPE Typ_Firma
+AS OBJECT (
+ RegNr INTEGER,
+ Name VARCHAR2(20),
+ Adresse Typ_Adresse,
+ Umsatz INTEGER,
+ Subunternehmen Typ_FirmaTab,
+ MEMBER FUNCTION getAnzSubunternehmen
+ RETURN INTEGER
+);
+/
+
+CREATE OR REPLACE TYPE BODY Typ_Firma AS
+ MEMBER FUNCTION getAnzSubunternehmen
+ RETURN INTEGER is
+ BEGIN
+ return self.Subunternehmen.count
+ END;
+ END;
+/
+
+CREATE TABLE T_Firma
+OF Typ_Firma(
+ RegNr primary key)
+NESTED TABLE Subunternehmen
+ STORE AS Firma_Subunternehmen_Liste;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg b/Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg Binary files differnew file mode 100644 index 0000000..ba8779c --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg |
