Datenbanken-Praktikum WS2009/2010
SQL-Developer
Ausführen von Procedures im SQLDeveloper
(Zwar etwas verspätet, aber dann habe ich wenigstens im nächsten Semester das nötige KnowHow und kann das vorher schon aufklären ;-).)
Unsere ganzen bisherigen SQL-Statements konnte man markieren und über den Button "Anweisung ausführen" laufen lassen:
Beim Aufruf einer Procedure ("execute ...") gibt es leider eine Fehlermeldung "ORA-00900 Ungültige SQL-Anweisung":
Lösung: das Statement mit dem Prozeduraufruf muss mittels "Script ausführen" gestartet werden:
Grund scheint zu sein, dass der SQL-Developer die Queries lokal parst und "execute" nicht kennt. Er muss sie ungeparst zum Server schicken, und das geht über
"Script ausführen".
Ausgabe von "dbms_output.put_line"
Die Ausgabe oben genannter Prozedur finden wir auf dem Karteireiter "DBMS-Ausgabe" wieder. Gemeinerweise muss dazu noch der Button "DBMS-Ausgabe aktivieren" gedrückt sein:
Alternative: SQL*Plus
"SQL*Plus" ist ein Oracle-eigenes Tool zum Ausführen von Befehlen. Sehr spartanisch und unkomfortabel, aber dafür
kann es Befehle wie "execute".
Starten:
Zu finden ist es im Oracle-Client-Verzeichnis (entweder in "c:\Programme\Oracle" oder oft direkt in "c:\ora...").
Hier der Pfad an der FH:
Anmeldeinformationen für die FH (Server = "p001"):
Grundlagen
Befehle werden ausgeführt, wenn:
Beispiel:
Ausführen:
Ein simpler "execute hello"-Aufruf wird hier nur anzeigen "Erfolgreich ausgeführt". Also muss vorher "set serveroutput on;" ausgeführt werden:
Troubleshooting
Wenn beim Anlegen einer Prozedur die Meldung "Warnung: Prozedur wurde mit Kompilierungsfehlern erstellt" kommt,
dann hilft der Befehl "show errors;":
Blatt 4
Abgabe bis 2.12.!
Aufgrund der Verständnisprobleme bei den Normalformen (vermutlich habe ich es heute auch nicht korrekt kapiert ;-) ), nochmal ein paar Definitionen von
http://de.wikipedia.org/wiki/Normalisierung_(Datenbank).
- 1. Normalform: ist verletzt, wenn Attribute nicht atomar sind (im Wikipedia-Beispiel: Feld "Album" enthält Titel und Interpret) oder nicht einen Einzelwert
enthalten (im Beispiel: Track-Liste)
- 2. Normalform: Bedingung: "Jedes nicht-primäre Attribut (nicht Teil eines Schlüssels) ist jeweils von allen ganzen Schlüsseln abhängig, nicht nur von einem Teil eines Schlüssels."
Also im Beispiel: Attribut "Titel" und "Interpret" hängen nur an der CD-ID, nicht aber an der Track-Nummer.
In Aufgabe 13: Datum hängt nur an Auftragsnummer, nicht aber an Artikelnummer. Analog für Artikelbezeichnung.
- 3. Normalform: Zitat: "Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und jedes Nichtschlüsselattribut von keinem
Schlüsselkandidaten transitiv abhängt."
Alternative Formulierung: "Ein Nichtschlüsselattribut darf nicht von einer Menge abhängig sein, die ausschließlich aus Nichtschlüsselattributen besteht. Ein
Nichtschlüsselattribut darf also nur direkt von einem Schlüssel abhängen."
In Aufgabe 13: Name und Ort sind aus der Kundennummer ableitbar, diese wiederum aus der Auftragsnummer, also aus einem Schlüsselkandidaten.
- Boyce-Codd-Normalform (BCNF): Zitat: "Die BCNF verhindert, dass Teile zweier aus mehreren Feldern zusammengesetzten Schlüsselkandidaten voneinander abhängig sind."
Das heißt (siehe auch
http://cis.cs.tu-berlin.de/Lehre/WS-0304/Sonstiges/db-pages/Inhalt/normalisierung/Folien/index-16.html
und die Folgefolie), dass bei einer Verletzung der BCNF ein Teil des Schlüsselkandidaten von einem andere Feld abhängen.
Mein Vorschlag zu Aufgabe 14 wäre: ProNr und Phase als Primärschlüssel, die Phase ergibt sich dann aus dem Leiter????
Ich bitte euch, das Aufgabenblatt 4 bis nächste Woche nochmal zu überarbeiten, und werde die bisherigen Abgaben nur auf Wunsch bewerten, um euch die Chance auf volle Punktzahl zu geben.
Nachtrag 23.11.2009: bitte begründet bei jeder Umformung schriftlich, warum ihr sie vorgenommen habt (also: welche Bedingung verletzt wurde). Beispiel: "Feld x ist nicht x. NF, weil
es vom Schlüsselkandidaten aus a und b abhängt".
Blatt 5
Abgabe bis 2.12.!
Bitte tragt bei den einzelnen Teilaufgaben jeweils das ausgeführte SQL-Statement sowie die Oracle-Fehlermeldung (Nummer ("ORA-1234")+Fehlertext) ein.
Ich nehme an, dass nach jedem Einzelschritt, der etwas an den Daten oder der Datenbank ändert, die Datenbank
wieder auf den Originalzustand zurückgesetzt werden soll (also alle Tabellen löschen und neu anlegen).
Aufgabe 17 kann ich nicht wirklich bewerten. Aber ihr solltet "Mondial" im eigenen Interesse erfolgreich anlegen,
da Folgeaufgaben garantiert darauf aufbauen!
Blatt 6
Hier ein Hinweis zur Verwendung von "DISTINCT", wenn
mehrere Spalten ausgewählt werden sollen. Fazit daraus: viele haben eine Query wie "select distinct name, pnummer, ... from" gewählt. Dass diese Query funktioniert,
ist allerdings nicht bei jeder Datenbank gegeben!
Blatt 7
(Hoffentlich richtige) Beispiellösungen zu Aufgabe 19 h und i, jeweils in zwei Varianten, einmal mit "group by" und einmal mit Subselects.
19h:
Variante 1: Subselect - es werden die Städte geholt, zu denen Treffer in einem Subselect auf "Land oder Provinz (PK von 'city') entspricht nicht aktueller Stadt"
herauskommen:
select * from city cityOuter, country
where
cityOuter.country = country.code and
cityOuter.name in (select cityInner.name from city cityInner where
cityInner.name = cityOuter.name and
(
cityInner.country <> cityOuter.country or
cityInner.province <> cityOuter.province)
)
order by cityOuter.name;
Variante 2: mit 'group by':
select city.name, country.name from city, country where city.country = country.code and
city.name in (select name from city group by name having count(*) > 1) order by city.name;
19i:
Variante 1: Subselect fast wie oben, nur mit dem Unterschied dass hier auf "gleiches Country" geprüft wird:
select * from city cityOuter, country
where
cityOuter.country = country.code and
cityOuter.name in (select cityInner.name from city cityInner where
cityInner.name = cityOuter.name and
cityInner.country = cityOuter.country and
cityInner.province <> cityOuter.province
)
order by cityOuter.name;
Variante 2: gleiches Subselect erweitert um die in der Aufgabenstellung gewünscht Information "nur Länder, in denen ..." (wäre in Variante 1 wohl auch mittels 'distinct' auf
'country.name' gegangen):
select * from country where name in
(
select countryInner.name from city cityOuter, country countryInner
where
cityOuter.country = countryInner.code and
cityOuter.name in
(select cityInner.name from city cityInner where
cityInner.name = cityOuter.name and
cityInner.country = cityOuter.country and
cityInner.province <> cityOuter.province
)
) order by country.name;
Variante 3: ganz simpel mittels 'group by' (folgende Query gibt mal wieder die Städte zurück):
select city.name, country.name from city, country where city.country = country.code
group by city.country, country.name, city.name HAVING count(*) > 1;
Stand 31.01.2010
Historie:
02.11.2009: Erstellt
12.11.2009: Aufgabe 2 und 3
18.11.2009: Hinweise zu Normalformen 1-3+BCNF
23.11.2009: Nachforderung zu Abgabe 4
25.11.2009: Hinweise zu Blatt 5
02.12.2009: Blatt 4, 5
03.12.2009: zwei ausstehende Bewertungen Blatt 5, Korrektur der Bewertung von Aufg. 16
04.12.2009: letzte ausstehende Bewertungen Blatt 5, Korrektur der Korrektur der Bewertung Aufg 16: ich hatte die Klammerung der Constraint "Name = CASH bei BWL" bei meinem Test
falsch abgetippt, deshalb waren eure Constrainst doch korrekt und die Punktabzüge wurden korrigiert.
10.12.2009: Bewertung Blatt 6
27.12.2009: Bewertung Blatt 7 und Musterlösung Aufgabe 19
06.01.2010: Bewertung Blatt 8
10.01.2010: Nachtrag Blatt 8 von 958492
15.01.2010: Bewertung Blatt 9, SQLDeveloper-Procedure-Aufruf-Erklärung
20.01.2010: SQL*Plus
24.01.2010: Bewertung Blatt 10
31.01.2010: Bewertung Blatt 11, Nachtrag Blatt 10 für 758319