From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf | Bin 0 -> 143675 bytes Bachelor/Datenbanken 2/Praktikum5/ORDML.sql | 61 +++++++++++ Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql | 82 ++++++++++++++ Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql | 119 +++++++++++++++++++++ Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql | 65 +++++++++++ Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg | Bin 0 -> 24153 bytes 6 files changed, 327 insertions(+) create mode 100644 Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf create mode 100644 Bachelor/Datenbanken 2/Praktikum5/ORDML.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum5/ORDML_p5.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum5/ORTypes.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum5/ORTypes_p5.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg (limited to 'Bachelor/Datenbanken 2/Praktikum5') diff --git a/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf b/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf new file mode 100644 index 0000000..6b5ad37 Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum5/DBII_Praktikum5.pdf differ 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 new file mode 100644 index 0000000..ba8779c Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum5/db2prk5.jpg differ -- cgit v1.2.3