Übungsblatt 05 - Informatik

Werbung
Universität Augsburg, Institut für Informatik
Datenbanken u. Informationssysteme
Übungsblatt 5
Datenbankprogrammierung (Oracle)
Aufgabe 1: Objekte in Oracle
In der Vorlesung haben Sie Nested Tables für die Darstellung von mehrwertigen Attributen kennengelernt. Nested
Tables sind beschränkt auf eine Spalte. Eine Erweiterung dieses Konzepts sind Objekte.
Unter anderem unterstützt Oracle das Ablegen von Objekten innerhalb von Relationen (objekt-relationale Daten). Um
ein Objekt in einer Relation abzuspeichern, muss - analog zu Nested Tables - zunächst ein entsprechender Datentyp
erzeugt werden:
CREATE TYPE meineKlasse AS OBJECT (
attribut01 INTEGER,
attribut02 VARCHAR2(20),
... );
Analog zu Nested Tables gibt es für Objekte einen Konstruktor bestehend aus Typ-Name als Schlüsselwort und den
Attributen als Parameter: meineKlasse(12, ’attribut02-Wert’, ...)
Der so erstellte Typ kann in jeder Tabelle als Datentyp verwendet werden. Auch kann damit eine Objekt-Tabelle
angelegt werden:
CREATE TABLE tabelle OF meineKlasse (PRIMARY KEY(attribut01));
Der Table Constraint gibt an, dass ein Attribut des Objekts als Primärschlüssel verwendet wird. Wird das Objekt nur
als Spalte in einer Relation verwendet, so muss der Spaltenname ebenfalls angegeben werden:
PRIMARY KEY(<SPALTE>.<ATTRIBUT>).
Um in einer anderen Tabelle einen Fremdschlüssel auf ein Element einer Objekt-Tabelle anzulegen, muss eine Spaltendefinition mit dem Schlüsselwort REF (eine Referenz) angegeben werden:
CREATE TABLE meineTabelle (
elem REF meineKlasse REFERENCES tabelle,
...
);
In diese Tabelle können Sie dann Referenzen auf Objekte aus tabelle einfügen. Eine Referenz erhalten Sie mit der
Funktion REF. Die Funktion DEREF dient der Dereferenzierung. Ausgehend von einer Referenz erhalten Sie dadurch
das entsprechende Objekt zurück.
SELECT REF(t), DEREF(REF(t)) FROM tabelle t WHERE ...
Gegeben sei nun das folgende ER-Diagramm:
contains
Publication
Keyword
title
title
code
code
publisher
research−area
a) Erstellen Sie für beide Entitäten Objekt-Typen und Tabellen, die die Objekte aufnehmen können. Die Relationstabelle soll Referenzen auf Publikations- bzw. Keyword-Einträge enthalten.
b) Fügen Sie einige Einträge in die erstellten Relationen ein.
c) Geben Sie die Einträge aus Publikation mit den passenden Keywords aus. Attribute von Objekten werden in
Oracle-SQL mit Punkt-Syntax ausgewählt.
1
Aufgabe 2: Materialized Views (Oracle)
Bei Views, die auf komplexen Abfragen definiert sind, kann es sinnvoll sein, die View-Daten nicht bei jedem Aufruf
neu generieren zu müssen, sondern sie zu materialisieren, d. h. als Kopie abzuspeichern und nur zu bestimmten
Zeitpunkten zu aktualisieren.
Oracle bietet hierfür das Konstrukt der materialisierten Views. Für materialisierte Views gibt es eine Trennung von
Abfragen: Einfache Abragen selektieren nur Zeilen aus einer einzigen Tabelle (keinem View!) und führen keine Mengenoperationen, Joins oder Gruppierungen aus. Jede Ergebniszeile einer einfachen Abfrage entspricht einer Zeile der
Ursprungstabelle. Bei komplexen Abfragen ist das nicht der Fall.
Die Syntax zur Erstellung eines materialisierten Views lautet:
CREATE MATERIALIZED VIEW <name>
[ REFRESH [ FAST | COMPLETE | FORCE ]
[ ON {DEMAND | COMMIT} ]
[ START WITH <startdatum> ] [ NEXT <datum> ]
[ WITH {PRIMARY KEY | ROWID} ] | NEVER REFRESH ]
[ FOR UPDATE ]
AS
SELECT ...
• Die Refresh-Option legt fest, wann und wie Oracle die Daten des materialisierten Views aktualisiert.
– FAST, nur für einfache Views. Es werden nur die veränderten/neuen Zeilen der Mastertabelle übertragen.
Um diese Methode verwenden zu können, muss zusätzlich ein View Log auf die Mastertabelle erzeugt
werden:
CREATE MATERIALIZED VIEW LOG ON <mastertabelle>;
– COMPLETE: Der View wird komplett neu aufgebaut.
– FORCE: veranlasst Oracle, zunächst einen FAST-Refresh zu versuchen. Ist das nicht möglich, wird der
View komplett neu aufgebaut.
• Der Zeitpunkt von Aktualisierungen wird festgelegt mittels
– ON COMMIT: Ein Update wird bei einem COMMIT auf die Mastertabelle(n) durchgeführt.
– ON DEMAND: Ein Update erfolgt erst bei Eingabe eines Refresh-Befehls. Dies kann (unter anderem) durch
den Aufruf des Befehls
EXECUTE DBMS_MVIEW.REFRESH(’<Refresh-Group-Name>’);
erfolgen. Mit diesem Befehl können auch materialisierte Views aktualisiert werden, für die eine andere
Refresh-Methode angegeben wurde.
• START WITH ... NEXT ...: Ein Intervall, das zeitgesteuerte Aktualisierungen ermöglicht, , in dem mit
START WITH ein Zeitwert und mit NEXT als darauffolgendem Zeitwert der Startzeitpunkt und die Intervalllänge angegeben werden. Ein täglicher Refresh um 03:00 Uhr morgens, beginnend am nächsten Tag, lässt
sich wie folgt realisieren:
START WITH TRUNC(sysdate) + 3/24 NEXT trunc(sysdate + 1) + 3/24
TRUNC entfernt dabei die Stundenzahl des aktuellen Zeitwerts, den SYSDATE liefert. Danach kann die Zeit in
Tagen hinzuaddiert werden, wobei 3 genau 03:00 Uhr morgens ist.
• NEVER REFRESH: Es wird nie eine Aktualisierung durchgeführt.
• Über WITH PRIMARY KEY | ROWID wird der Bezug zur Mastertabelle hergestellt.
• FOR UPDATE gibt an, dass der materialisierte View nicht schreibgeschützt ist.
Bearbeiten Sie nun folgende Aufgabe:
Gegeben sei die Relation katalog(id, name, beschreibung, ek preis, vk preis). ek preis ist der Einkaufspreis, vk preis
der Verkaufspreis. Erstellen Sie die Relation in der Datenbank und füllen Sie sie mit ein paar Beispieldaten.
Für Geschäftskunden soll ein materialisierter View erstellt werden. Der Einkaufspreis soll ausgeblendet und der
Netto-Verkaufspreis ohne Mehrwertsteuer angezeigt werden (vk preis = netto preis ∗ 1, 19). Im View sollen keine
Veränderungen an Daten ausgeführt werden können. Ein (möglichst resourcensparendes) automatisches Update soll
täglich um 2:00 Uhr morgens ausgeführt werden.
2
Aufgabe 3: SQL: Formatierung (Oracle)
Von Übungsblatt 4, Aufgabe 4 kennen Sie bereits die Tabellen eines Gebrauchtwagenhändlers.
Geben Sie für jedes Auto aus USED_CARS_SOLD die Nationalität des Herstellers aus, aufsteigend sortiert nach ID.
Der Beginn der Ergebnisrelation soll wie folgt aussehen:
CARS
make
BMW
Fiat
BMW
Peugeot
...
country
Germany
Italy
Germany
France
...
color
black
blue
white
green
...
price
6482
5444
7041
4516
...
age
8
12
5
11
...
Die Nationalitäten der einzelnen Automarken erfahren Sie im Internet, zum Beispiel bei
http://www.wikipedia.de.
Aufgabe 4: Berichte
Die Tabelle BESTELLUNGEN von Übungsblatt 2 kennen Sie bereits. Erstellen Sie eine nach Monaten gegliederte
Umsatzaufstellung für das Jahr 2008. Das Ergebnis soll die folgende Form aufweisen:
UMSATZ
Monat
2008-01
2008-02
2008-03
2008-04
2008-05
2008-06
2008-07
2008-08
2008-09
2008-10
2008-11
2008-12
Betrag
0
0
0
500
0
700
500
700
800
1400
0
0
Eine mögliche Strategie zur Lösung der Aufgabe könnte wie folgt aussehen:
• Sie benötigen eine Zeile für jeden Monat. Überlegen Sie sich eine Abfrage, die (unabhängig von Tabelle
BESTELLUNGEN) ein Tupel für jeden Monat des Jahres 2008 zurückliefert.
• Für jeden Monat müssen Sie nun die vorhandenen Umsätze zusammenzählen bzw. 0 ausgeben.
• Eine passende Formatierung des Datumswerts erreichen Sie mit Hilfe der Funktion
TO_CHAR(datum, ’YYYY-MM’).
Aufgabe 5: Subqueries
Gegeben ist folgende unkorrelierte Subquery.
SELECT veranstaltung
FROM teilnahme
WHERE student IN (SELECT matrikelnr
FROM student
WHERE name = ’Maier’)
Ändern Sie die Anfrage ab, so dass anstelle der Subquery ein Join verwendet wird.
3
Herunterladen