Voraussetzung für die Bearbeitung des folgenden Aufgabenblattes

Werbung
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.
Herunterladen