Prof. Dr. Stephan Karczewski Datenbanken 2 Aufgabe 3 Voraussetzung für die Bearbeitung des folgenden Aufgabenblattes ist die gründliche Bearbeitung des vorbereitenden Übungsblattes 3V. Vorgegeben sind die Tabellendefinitionen, die in der Datei create.sql gespeichert sind. Verwenden Sie diese ebenso wie die insert-Befehle, die in insert.sql stehen. Damit können Sie Ihre Ergebnisse anhand der folgenden Beispiele verifizieren. 1. Entwickeln Sie zunächst einen SQL-Befehl, der auf dem Bildschirm die Matrikelnummer von Studenten, die Vorlesungen hören, die als Voraussetzung ‚DB2’ haben, ausgibt. Anschließend entwickeln Sie ein PL/SQL-Programm, das die gleiche Aufgabe löst. 2. Entwickeln Sie zwei Varianten für die folgende Aufgabe; die erste Variante soll mit einem Subselect arbeiten, die zweite ohne: Ausgabe aller Vorlesungen, die als Voraussetzungen Vorlesungen haben, die wiederum eine andere Vorlesung als Voraussetzung haben. 3. Die bisherigen Aufgaben funktionieren problemlos auch ohne Programm. Für die folgende Aufgabe ist ausschließlich ein PL/SQL-Programm zu schreiben: Bilden Sie die transitive Hülle aller Abhängigkeiten von Vorlesungen. Gegeben sei eine Tabelle VorausFuer mit zwei Spalten Voraussetzung und Für. Ergebnis ist wiederum eine Tabelle TransHuelle mit den oben genannten Spalten. Jedoch soll diese Tabelle zusätzlich alle Abhängigkeiten von Veranstaltungen enthalten, die über 2 oder mehr Stufen existieren. Beispiel: VorausFuer: Voraus Fuer DB1 TransHuelle: Voraus Fuer DB2 DB1 DB2 DB2 DB3 DB1 DB3 DB3 DB4 DB1 DB4 DB4 DB5 DB1 DB5 DB2 DB3 DB2 DB4 DB2 DB5 DB3 DB4 DB3 DB5 DB4 DB5 Tipp: Erstellen Sie zunächst eine Kopie der Tabelle VorausFuer in eine Hilfstabelle TransHuelleHilf mit dem Befehl „insert into TranshuelleHilf select * from VorausFuer“. Anschließend füllen Sie die Tabelle Transhuelle1 jeweils mit den Zeilen auf, die in Prof. Dr. Stephan Karczewski Datenbanken 2 Aufgabe 3 einem Schritt transitiv sind (also in obigem Beispiel folgt aus DB1 -> DB2 -> DB3 jetzt DB1 -> DB3, jedoch zunächst noch nicht DB1 -> DB4). Nach jedem Durchlauf mit Auffüllen der Zeilen kopieren Sie die Tabelle TransHuelleHilf in die Tabelle TransHuelle, jedoch ohne doppelte Zeilen! Sollte sich die Anzahl der Zeilen in TransHuelle von einem zum nächsten Durchgang nicht mehr verändern, dann ist die Menge der ableitbaren Abhängigkeiten erschöpft. Das Ergebnis steht in der Tabelle TransHuelle. 4. Erstellen Sie zu folgender Aufgabenstellung ein Programm: Geben Sie zu jedem Studenten (Matrikelnummer) die Anzahl der Vorlesungen aus, die dieser Student aufgrund der Einträge in der VorausFuer-Tabelle und der daraus ableitbaren Veranstaltungen gehört haben muss. Bauen Sie Ihr Programm auf dem vorangegangenen auf. Vorgehen: a. Bilden der transitiven Hülle aus der Tabelle vorausfuer (s. Aufgabe 3). b. Aufbau einer neuen Tabelle stud_vl, in der Sie Matrikelnummer und gehörte Vorlesung jedes Studenten eintragen. Zusätzlich tragen Sie die Vorlesungen ein, die in der Tabelle mit der transitiven Hülle im „Fuer“-Feld einen Eintrag haben, der auch bei dem aktuellen Student steht und tragen daraus folgend bei diesem Studenten in stud_vl die Vorlesung „voraus“ ein, da dieser Student diese Vorlesung ja bereits gehört haben muss. c. Die Tabelle stud_vl hat Einträge aller Vorlesungen, die jeder Student gehört haben muss. Zunächst müssen evtl. doppelte Einträge eliminiert werden. d. Anschließend müssen Sie aus PL/SQL heraus mit Hilfe eines geeigneten SQL-Befehl die Zeilen pro Student zählen. Beispiel: Gegeben seien die folgenden Tabellen mit Inhalten (es werden noch die Tabellen Vorlesungen, Studenten benötigt, die hier jedoch nicht weiter betrachtet werden: Studenten: Hoert: Matrikelnummer Studiendauer MD-891372 V_Name SWS 5 DB1 4 HRO-912291 3 DB2 4 KK-888888 3 DB3 2 DB4 2 DB5 2 Matrikelnummer V_Name MD-891372 Vorlesungen: VorausFuer: Voraus Fuer DB5 DB1 DB2 HRO-912291 DB4 DB2 DB3 KK-888888 DB3 DB3 DB4 DB4 DB5 Prof. Dr. Stephan Karczewski Datenbanken 2 Aufgabe 3 Ergebnis der Stud_VL-Tabelle sollte sein: Stud_VL: Matrikelnummer V_Name MD-891372 DB5 MD-891372 DB4 MD-891372 DB3 MD-891372 DB2 MD-891372 DB1 HRO-912291 DB4 HRO-912291 DB3 HRO-912291 DB2 HRO-912291 DB1 KK-888888 DB3 KK-888888 DB2 KK-888888 DB1 Die Reihenfolge der Zeilen spielt dabei keine Rolle. Mit einem entsprechenden Teilprogramm muss man abschließend die Anzahlen richtig ausgeben. Hierzu erstelle man eine Tabelle Stud_Anzahl mit den Spalten Matrikelnummer und Anzahl. Das Ergebnis nach obiger Stud_VL-Tabelle müsste wie folgt aussehen: Stud_Anzahl: Matrikelnummer Anzahl MD-891372 5 HRO-912291 4 KK-888888 3 Die Reihenfolge der Zeilen spielt dabei keine Rolle.