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:
Anweisung ausführen

Beim Aufruf einer Procedure ("execute ...") gibt es leider eine Fehlermeldung "ORA-00900 Ungültige SQL-Anweisung":
ORA-00900

Lösung: das Statement mit dem Prozeduraufruf muss mittels "Script ausführen" gestartet werden:
Script ausführen
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:
DBMS-Ausgabe

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:
sqlplusw.exe

Anmeldeinformationen für die FH (Server = "p001"):
Login

Grundlagen
Befehle werden ausgeführt, wenn:
Beispiel:
create procedure

Ausführen:
Ein simpler "execute hello"-Aufruf wird hier nur anzeigen "Erfolgreich ausgeführt". Also muss vorher "set serveroutput on;" ausgeführt werden:
execute

Troubleshooting
Wenn beim Anlegen einer Prozedur die Meldung "Warnung: Prozedur wurde mit Kompilierungsfehlern erstellt" kommt, dann hilft der Befehl "show errors;":
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).


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