UNIVERSITÄT BASEL Prof. Dr. Heiko Schuldt MSc. Nenad Stojnić BSc. Ivan Giangreco BSc. Florian Lindörfer cs241: Datenbanken mit Übungen HS 2011 Übung 5 Abgabe bis: 4.11.2011 Hinweise: Modalitäten der Abgabe: Bitte laden Sie Ihre Lösungen VOR dem Mittwochtermin der Übung auf das courses-system. Verspätet abgegebene Lösungsblätter können nicht berücksichtigt werden. Modalitäten der Bearbeitung: Kleingruppen von bis zu zwei Personen sind möglich. Geben Sie auf der Lösung die Namen der Gruppenmitglieder an. schemauebungsdb.sql und valuesuebungsdb.sql enthalten die Skripte, mit deren Hilfe Sie Ihre Lösungen zu den Aufgaben 1 und 2 testen können. flug.sql und functions.sql enthalten die Skripte, mit deren Hilfe Sie Ihre Lösung zu der Aufgabe 3 testen können. Die Relationen in den Scripten enthalten aus Kompatibilitätsgründen keine Umlaute - auch die Datensätze enthalten keine Umlaute. Zudem wurde der Bindestrich im Attributnamen Reihenfolgen-Nummer weggelassen, denn viele Datenbanken unterstützen den Bindestrich für String-Attribute nicht. Laden Sie Ihre in PL/SQL zu erstellenden Lösungen als SQL-Script in courses hoch - nicht als Script abgegebene Lösungen werden nicht berücksichtigt. Die Lösungen (PL/SQL und Java) müssen lauffähig sein. Die Lösungen müssen diesmal nicht nur in courses hochgeladen werden, sondern die Gruppen, d.h., alle Mitglieder einer Gruppe, müssen ihre Lösungen vorstellen (entweder in der Übungsstunde oder individuell ausserhalb der Übungszeit). Es wird empfohlen Oracle als DBMS zu nutzen. 1
Aufgabe 1: Views (12 Punkte) Gegeben ist der folgende Ausschnitt aus dem Relationenschema unserer Übungsdatenbank mit jeweils einem Beispieltupel. (Beachten Sie, dass die AufgID der enthält-relation lediglich auf Hauptaufgaben (also nicht auf Teilaufgaben) verweist.) Uebungsblatt enthaelt Aufgabe Autor besteht aus (UeID, Nr, Semester, Vorlesung) 45, 1, HS08, Datenbanken (AufgID, UeID, ReihenfolgenNummer) 33, 45, 1 (AufgID, Punkte, Schwierigkeitsgrad, Text, AutorID) 33, 20, 2, Sie sind Tutor(in)..., 1 (AutorID, Name, Vorname, Titel) 4, Norris, Chuck, Dipl.-Inf. (HauptAufgID, TeilAufgID, ReihenfolgenNummer) 33, 34, 1 Zusätzlich sind gegeben die folgenden View Definitionen die sich auf das Relationenschema beziehen: CREATE OR REPLACE VIEW Vorl_db_1 as SELECT a1.aufgid, a1.punkte FROM uebungsblatt u, enthaelt e, aufgabe a1 AND e.aufgid = a1.aufgid AND u.semester = WS06 AND u.vorlesung = Datenbanken AND NOT EXISTS ( SELECT a.punkte FROM uebungsblatt u, enthaelt e, aufgabe a AND e.aufgid = a.aufgid AND u.semester = WS06 AND u.vorlesung = Datenbanken AND a.punkte < a1.punkte ) 2
CREATE OR REPLACE VIEW Vorl_db_2 as SELECT a1.aufgid, a1.punkte FROM uebungsblatt u1, enthaelt e, aufgabe a1 WHERE u1.ueid = e.ueid AND e.aufgid = a1.aufgid AND u1.semester = WS06 AND u1.vorlesung = Datenbanken AND a1.punkte <= ALL ( SELECT a.punkte FROM uebungsblatt u, enthaelt e, aufgabe a AND e.aufgid = a.aufgid AND u.ueid = u1.ueid ) WITH CHECK OPTION; a) Beschreiben Sie mit wenigen Worten verbal, was die beiden Views machen, d.h. welches Ziel ein Ersteller dieser Views hat. b) Erstellen Sie eine View mit Hilfe des Schlüsselwortes having, die dasselbe macht wie die View Vorl db 2. (2 Punkte) c) Formulieren Sie eine Anfrage, die aufbauend auf View Vorl db 2, dieselben Tupel selektiert wie View Vorl db 2, jedoch die komplette Attributliste der Relation Aufgabe ausgibt (dabei sollen keine Attribute mehrfach ausgegeben werden). d) Sie stellen fest, dass Sie beim Einfügen der Aufgabe mit der AufId=6, nur 5 statt 6 Punkte vergeben haben. Können Sie diese Änderung mit Hilfe der Views durchführen? Begründen Sie Ihre Antwort und geben Sie gegebenenfalls eine Alternative an, um die Änderung doch durchzuführen. e) Erstellen Sie eine View, die alle Übungen der Vorlesung Programmieren II ausgibt, unabhängig vom Semester, in welchem sie verwendet wurden. Dabei soll die View Änderungen erlauben, wie z.b. das ändern von WS06 in WS08. Testen Sie Ihre View mit je einem insert und einem update-statement. Geben Sie auch diese Statements im Sql-Script an. 3
(2 Punkte) f) Was müssen Sie tun, um zu vermeiden, dass über Ihre View Tupel mit dem Attributwert Vorlesung= Programmieren II in Vorlesung= Datenbanken geändert werden? Begründen Sie Ihre Antwort. Testen Sie Ihre View wiederum mit je einem Insert- und einem Update-Statement und geben Sie diese im SQL-Script an. (2 Punkte) g) Formulieren Sie eine Updateable View, die alle neuen Autoren ausgibt. (Neue Autoren sind solche, die noch keine Aufgaben erstellt haben.) Testen Sie Ihre View mit je einem insert und einem update-befehl. Geben Sie auch diese im Sql-Script an. (3 Punkte) Aufgabe 2: Stored Procedures (4 Punkte) Gegeben ist wieder das Relationenschema unserer Übungsdatenbank aus der ersten Aufgabe. Fügen Sie der Tabelle Autor eine Spalte stufe hinzu, wobei in dieser Spalte nur Anfaenger, Fortgeschrittener oder Profi stehen dürfen. Der default-wert soll Anfaenger sein. Erstellen Sie in PL/SQL eine Stored Procedure profil_level. Die Prozedur soll für die gesamte Tabelle Autor die stufe Anfaenger durch Fortgeschrittener ersetzen, wenn er zwei bis drei Aufgaben erstellt hat und Profi, wenn er mindestens vier Aufgaben erstellt hat. Verwenden Sie bei der Definition der Variablen wo immer möglich anchored types. Aufgabe 3: Stored Function - Flughafenanwendung (4 Punkte) In dieser Aufgabe soll mit einer Flugdatenbank gearbeitet werden. Die benötigten Dateien zum Erstellen der Datenbank finden Sie auf der Seite mit den Übungsmaterialien. Ziel der Aufgabe ist es, alle verfügbaren Flugverbindungen ab einem anzugebenden Flughafen zu finden, die maximal eine bestimmte Anzahl Teilstrecken enthalten, während der gesamten Reise immer die gleiche Fluglinie benutzen und sich immer weiter vom Ausgangsort entfernen. Erzeugen Sie zunächst die benätigten Tabellen und Daten, indem Sie das Skript flug.sql ausführen. Im Skript functions.sql finden Sie zudem einige vordefinierte Funktionen in PL/SQL, die Sie für die Lösung der Aufgabe benötigen. Implementieren Sie die PL/SQL-Funktion DIST ICAO, die die Distanz in nautischen Meilen zwischen zwei Flughäfen berechnet. Die Funktion soll folgende Signatur haben: FUNCTION DIST_ICAO(ap1 IN VARCHAR, ap2 IN VARCHAR) RETURN REAL Nutzen Sie dabei die schon verfügbaren Funktionen zur Berechnung der Distanz. 4
Achtung: In einigem Fällen erzeugt die Funktion DISTANCE unerklärliche Fehler, wenn beide Eingabepunkte identisch sind. Fangen Sie diesen Fall (ap1 == ap2) daher in der Funktion DIST ICAO ab und geben Sie direkt den Wert 0 zur uck. Hinweis: Bei der Arbeit mit Oracle und ExecuteQuery sind Funktionen als Single Statement auszuführen. In Oracle gibt es eine Spezial- Tabelle namens DUAL, mit der Sie SELECT-Anfragen ohne echte Tabelle als Ziel ausführen können. Diese eignet sich gut zum Testen Ihrer Funktion: SQL> select dist_icao( LFSB, KORD ) from dual; DIST_ICAO( LFSB, KORD ) ------------------------ 3809.35812 Die Ergebnisse dieser Teilaufgabe werden im Folgenden noch benötigt. Sollten Sie diese Teilaufgabe wider Erwarten nicht lösen können, so können Sie alternativ auf die Funktion mittels des public synonyms DIST ICAO GEG zugreifen. 5