Musterlösung - Informationssysteme

Werbung
Uni Duisburg-Essen
Fachgebiet Informationssysteme
Prof. Dr. N. Fuhr
Praktikum Datenbanken / DB2
Woche 7: Noch mehr SQL (Fortgeschrittene Konzepte)
Musterlösung
(a) Schreibt zwei UDFs vorname() und nachname(), die zu Zeichenketten
(Strings) des beschriebenen Formats, die Vor- bzw. Nachnamen zurückliefern. Ist der Eingabeparameter nicht in kompatiblem Format, soll vorname()
den leeren String und nachname() die komplette Zeichenkette zurückliefern.
CREATE FUNCTION vorname (name VARCHAR(75))
RETURNS VARCHAR(75)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
BEGIN ATOMIC
DECLARE vor VARCHAR(75);
IF locate(’,’,name)=0 THEN SET vor=’’;
ELSE SET vor=substr(name,locate(’,’,name)+2);
END IF;
RETURN vor;
END @
CREATE FUNCTION nachname (name VARCHAR(75))
RETURNS VARCHAR(75)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
BEGIN ATOMIC
DECLARE nach VARCHAR(75);
IF locate(’,’,name)=0 THEN SET nach=name;
ELSE SET vor=substr(name,1,locate(’,’,name)-1);
END IF;
RETURN nach;
END @
VALUES (vorname(’Bloom, Orlando’))
’Orlando’
VALUES (vorname(’Orlando Bloom’))
’’
VALUES (nachname(’Bloom, Orlando’))
’Bloom’
VALUES (nachname(’Orlando Bloom’))
’Orlando Bloom’
(b) Budgets sind in der Filmdatenbank als Zeichenkette gespeichert, die mit
dem dreistelligen Währungscode beginnt und bei der Dreierblöcke von
Praktikum Datenbanken / DB2
Woche 7: Noch mehr SQL (Fortgeschrittene Konzepte)
Seite 1 von 4
Uni Duisburg-Essen
Fachgebiet Informationssysteme
Prof. Dr. N. Fuhr
Ziffern durch Kommata getrennt werden, z.B. ’DEM 1,000,000’. Um die
Budgets vergleichbar zu machen, schreibt eine UDF, welche einen solchen
String in Euro umrechnet und als Integer zurückgibt. Es soll reichen, die
Umrechnung für drei Währungen zu machen. In anderen Fällen soll die
Funktion eine Fehlermeldung geben.
CREATE FUNCTION euro (budget VARCHAR(75))
RETURNS INT
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
BEGIN ATOMIC
DECLARE zahl INTEGER;
DECLARE waehrung CHARACTER(3);
DECLARE eurobudget INTEGER;
SET zahl=decimal(replace(right(budget,length(budget)-3),’,’,’’));
SET waehrung=left(budget,3);
SET eurobudget = (
CASE waehrung
WHEN ’ATS’ THEN zahl/13.7603
WHEN ’BEF’ THEN zahl/40.3399
WHEN ’CHF’ THEN zahl/1.5530
WHEN ’CZK’ THEN zahl/31.7537
WHEN ’DEM’ THEN zahl/1.95583
WHEN ’DKK’ THEN zahl/7.4377
WHEN ’ESP’ THEN zahl/166.386
WHEN ’FIM’ THEN zahl/5.94573
WHEN ’FRF’ THEN zahl/6.55957
WHEN ’GBP’ THEN zahl/0.6938
WHEN ’GRD’ THEN zahl/340.750
WHEN ’IEP’ THEN zahl/0.78756
WHEN ’ITL’ THEN zahl/1936.27
WHEN ’JPY’ THEN zahl/129.2850
WHEN ’LUF’ THEN zahl/40.3399
WHEN ’NLG’ THEN zahl/2.20371
WHEN ’NOK’ THEN zahl/8.1638
WHEN ’PTE’ THEN zahl/200.482
WHEN ’SEK’ THEN zahl/8.9605
WHEN ’USD’ THEN zahl/1.1755
ELSE
NULL
END );
IF eurobudget IS NULL THEN
SIGNAL SQLSTATE ’23ICU’
SET MESSAGE_TEXT = ’Fehler: Unbekannte Waehrung’;
ELSE
RETURN eurobudget;
END IF;
END @
Praktikum Datenbanken / DB2
Woche 7: Noch mehr SQL (Fortgeschrittene Konzepte)
Seite 2 von 4
Uni Duisburg-Essen
Fachgebiet Informationssysteme
Prof. Dr. N. Fuhr
VALUES (euro(’DEM 1,000’))
511
VALUES (euro(’USD 1,000’))
850
VALUES (euro(’FRU 1,000’))
SQL0438N Application raised error with diagnostic text: "Fehler: Unbekannte
Waehrung". SQLSTATE=23ICU
(c) Benutzt die Währungsinformation des Attributs budget für eine UDF
herkunftsland().
CREATE FUNCTION herkunftsland(budget VARCHAR(75))
RETURNS VARCHAR(50)
DETERMINISTIC
LANGUAGE SQL
CONTAINS SQL
BEGIN ATOMIC
DECLARE waehrung CHARACTER(3);
SET waehrung=left(budget,3);
RETURN
CASE waehrung
WHEN ’ATS’ THEN ’Österreich’
WHEN ’BEF’ THEN ’Belgien’
WHEN ’CHF’ THEN ’Schweiz’
WHEN ’CZK’ THEN ’Tschechien’
WHEN ’DEM’ THEN ’Deutschland’
WHEN ’DKK’ THEN ’Dänemark’
WHEN ’ESP’ THEN ’Spanien’
WHEN ’FIM’ THEN ’Finnland’
WHEN ’FRF’ THEN ’Frankreich’
WHEN ’GBP’ THEN ’Großbritannien’
WHEN ’GRD’ THEN ’Griechenland’
WHEN ’IEP’ THEN ’Irland’
WHEN ’ITL’ THEN ’Italien’
WHEN ’JPY’ THEN ’Japan’
WHEN ’LUF’ THEN ’Luxemburg’
WHEN ’NLG’ THEN ’Niederlande’
WHEN ’NOK’ THEN ’Norwegen’
WHEN ’PTE’ THEN ’Portugal’
WHEN ’SEK’ THEN ’Schweden’
WHEN ’USD’ THEN ’USA’
ELSE ’Unbekannt’
END;
END @
VALUES (herkunftsland(’DEM 1,000’))
Deutschland
Praktikum Datenbanken / DB2
Woche 7: Noch mehr SQL (Fortgeschrittene Konzepte)
Seite 3 von 4
Uni Duisburg-Essen
Fachgebiet Informationssysteme
Prof. Dr. N. Fuhr
VALUES (herkunftsland(’USD 1,000’))
USA
VALUES (herkunftsland(’FRU 1,000’))
Unbekannt
(d) Schreibt eine tabellenwertige SQL-UDF kategorie(), die zu einem Genrenamen (als String) alle Tupel aus der Tabelle film (!) zurückliefert, die
zu diesem Genre gehören.
CREATE FUNCTION kategorie(genrename varchar(30))
RETURNS TABLE (titel varchar(100),
jahr integer,
art char(2),
veroeffentlicht char(10))
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN
SELECT f.*
FROM film AS f RIGHT JOIN genre AS g
ON f.titel=g.produktion
AND f.jahr=g.jahr
WHERE g.genre=genrename;
SELECT *
FROM table(kategorie(’Action’)) AS a
WHERE a.titel like ’A%’;
Praktikum Datenbanken / DB2
Woche 7: Noch mehr SQL (Fortgeschrittene Konzepte)
Seite 4 von 4
Herunterladen