Klausur 2 - FH Dortmund

Werbung
Aufgabe 1: (20 Punkte)
a) Skizzieren Sie den Unterschied der Abbildung schwacher Entitätsmengen im klassischen
und im objektrelationalen Datenmodell (mit Feinheiten !) (5 P)
Klassisch: eigene Relation mit zusammengesetztem Primärschlüssel , ein Teil des
Primärschlüssels ist Fremdschlüssel auf die „starke“ Relation. Tupel werden gelöscht, wenn
Tupel in starker Relation gelöscht werden.
Objektrelational: Einbettung der schwachen Entitätsmenge als tablewertiger Typ (NF2)
b) Beschreiben Sie die wesentlichen Unterschiede von MAP-Funktionen und Order-Funktionen
zum Ordnen von Datentypen im objektrelationalen Oracle (3 P)
Map Funktion: Daten des Typs werden auf einen Basistyp abgebildet und die Werte dieses
Basistyps für zwei Objekte verglichen.
Order Funktion: Wird mit einem Objekt aufgerufen, das andere Objekt ist self. Algorithmus
vergleicht die beiden Objekte direkt miteinander und gibt 0, 1 bzw. -1 zurück.
c) Welche Datentyperweiterungen kennt objektrelationales Oracle für Tupeltabellen ? (3 P)
Alle Erweiterungen möglich (BLOB, CLOB, table etc.)
d) Was ist die Besonderheit temporärer DBMS ? (2 P)
Alle Fakten sind mit einer Gültigkeitsdauer versehen.
e) Was versteht man unter Overriding ? (2P)
Subklasse kann ererbte Attribute oder Methoden überschreiben (Redefinition)
f)
Geben Sie ein Beispiel für „Late Binding“ (3 P)
Für KFZ’s ist eine allgemeine Methode „Berechne KFZ Steuer“ definiert. Diese wird im
Untertyp LKW’s durch eine gleich-lautende Methode überschrieben.
Im Aufruf select kfz_instanz.berechne_kfz_steuer() … entscheidet das DBMS zur Laufzeit
anhand des Typs von KFZ_Instanz, welche Methodenimplementierung ausgeführt wird.
g) Was ist in objektrelational Oracle referenzierbar ? (2 P)
Nur Instanzen einer typisierten Tabelle können mittels eines Referenzattributs referenziert
werden!
Aufgabe 2) (20 Punkte)
Überführen Sie folgendes E-R-Diagramm in eine objektrelationale Datenbank (Oracle) und
schreiben Sie die SQL-Anweisungen für die benötigten Typen und objektrelationalen Tabellen.
Strasse
(char(30))
NR
(int)
Strasse
(char(30))
PLZ (int)
PLZ (int)
Ort
(char(30))
GebDat
(date)
Adresse
Adresse
m
Mitarbeiter
Ort
(char(30))
arbeitete
_fuer
1
n
Unternehmer
Name (char)
Zeitraum
Position
(char)
.
erhielt
m
Von
(date)
n
Datum
(date)
verfasst
Beurteilung
n
Inhalt (langer
text)
Syntaxhilfe:
create type <type> as object (
);
create type <type> as varray(<anzahl>) of <basistype>
create type <type> as table of <basistype>
create type referenz ( a ref <basistype> )
create table <tabelle> of <basistype> [(<integritaetsbedingungen>) ] [nested table <attribut>
store as <tabelle>]
Lösung:
create type adresse_typ as object (strasse char(30), plz int, ort char(30) );
create type adresse_table as table of adresse_typ;
create type unternehmer_typ as object (name char(30), adresse adresse_typ);
create type viele_unternehmer table of ref unternehmer
create type beurteilung_typ as object (datum date, inhalt clob, verfasst viele_unternehmer)
create type position_table as table of char;
create type arbeitet_fuer_type as object (positionen position_table, von date, unternehmer ref
unternehmer_typ )
create type arbeitet_fuer_table as table of arbeitet_fuer_type
create type mitarbeiter as object (nr int, gebdat date, adressen adresse_table, arbeitete_fuer
arbeitet_fuer_table)
create table unternehmer of unternehmer_typ (name primary key)
create table mitarbeiter of mitarbeitertyp (nr primary key, nested table adressen store as
adressen_rel, nested table arbeitete_fuer store as arbeitete_fuer_rel)
Basis für die folgenden Aufgaben ist das im Anhang vorgegebene Typsystem
(Bundesliga) bzw. die Typtabellen
Aufgabe 3 (10 P):
Erweitern Sie den Typ „Spiel“ um eine Methode „Arne_Friedrich_Tore“ , welche die Anzahl der Tore
berechnet, die in einem Spiel von einem Abwehrspieler erzielt wurden (Position ‚Abwehr’)
Implementieren Sie diese Methode.
alter type spieltyp add member function Arne_Friedrich_Tore return integer cascade;
member function Arne_Friedrich_Tore return integer as
a integer;
begin
select count(*) into a from spiele s, table(s.spiel_tore) t ,
table( treat(deref( t.torschuetze) as spielertyp).position) p
where value(p)=’Abwehr’ and self.nr=s.nr
return a;
end;
Aufgabe 4 (15 P):
Erweitern Sie den Ligamannschaftstyp um eine „order“-Ordnungsfunktion. Sie soll Mannschaften
in folgender Reihenfolge sortieren:
a) Anzahl der der Mannschaft zugeordneten gesunden Spieler
b) Anzahl der der Mannschaft zugeordneten verletzten Spieler
Die Werte sollen nicht Typ entnommen werden (anzahl_spieler_gesamt etc.) sondern mittels des
Attributes „Spieler“ des Typs neu berechnet werden. Implementieren Sie diese Ordnungsfunktion.
Lösung:
create type body Ligamannschaft as
order member function limaorder (m ligamannschaftstyp) return integer
as e1 integer ;
e2 integer ;
begin
select p.count into e1 from ligamannschaft h , table (spieler) p where h.bezeichnung =
self.bezeichnung and value(p) is of only(spielertyp)
select p.count into e2 from ligamannschaft h , table (spieler) p where h.bezeichnung =
m.bezeichnung and value(p) is of only(spielertyp)
if (e1 = e2) then
select p.count into e1 from ligamannschaft h , table (spieler) p where h.bezeichnung =
self.bezeichnung and value(p) is of only(verletzterspielertyp)
select p.count into e2 from ligamannschaft h , table (spieler) p where h.bezeichnung =
b.bezeichnung and value(p) is of only(verletzterspielertyp)
if (e1 = e2) then return 0 ;
elsif (e1<e2) then return –1
else return 1;
end if ;
elsif (e1<e2) then return –1 ;
else return 1
end if ;
end ;
end ;
Aufgabe 5 (35 P)
Lösen Sie folgende Aufgaben mittels SQL (Benutzen Sie bei Deferenzierungen grundsätzlich
explizit den deref-Operator ! Sonst Punktabzug)
a) Wieviele Spieler hat die Ligamannschaft, die in der Ligatabelle „ranking“ 1 hat. (5 P)
Select l.spieler.count from ligamannschaften l where ref(l) = (select mannschaft from
ligatabellenplaetze where ranking=1)
b) Fügen Sie den Spieler Costa mit der Nummer 231 ein. Er hat keine Adresse, die
Kommunikationsverbindungen haben einen Eintrag, der z.Z. leer ist, er ist heute vor 5
Tagen eingestellt worden, seine Nationalität ist Deutsch (‚D‘), sein Gehalt ist 30000,- €,
Spieleinsätze hat er noch nicht, auch keine Tore geschossen. Er kann auf denselben
Positionen spielen wie der Spieler mit der Nummer 232. (6 P)
Insert into personen (spielertyp(231, ‚Costa‘, Null, kommvb(null), current_date-5, 30000,
cast (multiset(select treat(Value(r) as spielertyp).position from personen r where
r.nr=232)) as positiontabelletyp ,
0, 0, (select ref(p) from nationalitaet p where p.nationalitaet=’D’) )
c) Liste den Namen und die Kommunikationsverbindungen des Präsidenten und des
Vizepräsidenten des Vereins ‚Schalke 04‘. (5 P)
Select name, kommvb
From personen p
where ref(p) =
((select praesident from vereine where bezeichnung = 'B Schalke 04)) or
ref(p) = ((select vizepraesident from vereine where bezeichnung = ' Schalke 04‘))
d) Wie viele Tore wurden am letzten Spieltag (22.01.2010) von Spielern geschossen, die aus
Brasilien stammen (Nationalität ‚BRA‘) (4 P)
Select count(*) from spiele s , table (spiel_tore) p where s.datum=’22.01.2010’ and
deref(treat(deref(value(p).torschuetze) as spielertyp).nationalitaet).nationalitaet=’BRA’
e) Für welche Ligamannschaften (Bezeichnung) arbeiten Vereinsärzte, deren Fachrichtung
‚Orthopädie‘ ist ? (4 P)
Select bezeichnung from ligamannschaften l where deref(treat(
deref(value(l).mannschaftsarzt) as arzttyp).fachrichtung ).fachrichtung = ‚Orthopädie‘
f)
Nennen Sie die Nummer, den Namen und genau eine (beliebige) Position aller Spieler, die
in der Nachspielzeit (Spielminute > 90) eines Spiels des letzten Spieltages (22.01.2010) ein
Tor erzielt haben. (6 P)
Select deref(value(t).torschuetze).nr, deref(value(t).torschuetze).name,
treat(deref(value(t).torschuetze) as spielertyp).position(1)
from spiele p, table (spieltore ) t
Where s.datum=’22.01.2010’ and t.spielminute > 90
g) Löschen Sie den Spieler mit dem Namen ‚Barrios‘ aus der Mannschaftsaufstellung des
Spiels vom 22.01.2010, bei dem ‚BVB‘ Heimmannschaft war. (5 P)
Delete from table(select mannschaftsaufstellung from spiele s where
s.datum=’22.01.2010‘ and deref(s.heimmannschaft).bezeichnung=‘BVB‘ ) t
Where deref(value(t)).name=‘Barrios‘
Herunterladen