UEB Übungen zum Seminar 4053 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 Aufgaben zu Kapitel 1 ....................................................................... 2 Aufgaben zu Kapitel 2 ....................................................................... 3 Aufgaben zu Kapitel 3 ....................................................................... 6 Aufgaben zu Kapitel 4 ....................................................................... 8 Aufgaben zu Kapitel 5 ....................................................................... 9 Aufgaben zu Kapitel 6 ..................................................................... 10 Aufgaben zu Kapitel 7 ..................................................................... 11 Aufgaben zu Kapitel 8 ..................................................................... 12 Aufgaben zu Kapitel 9 ..................................................................... 14 Aufgabe zu Kapitel 10 ..................................................................... 15 Aufgaben zu Kapitel 11 ................................................................... 16 Aufgaben zu Kapitel 13 ................................................................... 18 Zusatzaufgaben............................................................................... 19 1.2.066 / 4053 UEB-1 Übungen UEB 1 Übungen 1.1 Aufgaben zu Kapitel 1 1. Welcher Teil ist bei einem PL/SQL-Block obligatorisch, und welche Teile kann ein Block noch enthalten? 2. Welches Recht brauchen Sie a) um eine Funktion anlegen zu können? b) um eine Funktion im eigenen Schema ausführen zu können? c) um eine Funktion in einem fremden Schema ausführen zu können? 3. Ist dieser Code korrekt? BEGIN var_a /* var_b */ BEGIN date; number; /* Wird für die Gehälter benutzt */ NULL; END; / 4. Wie können Sie sicherstellen, dass Ihre PL/SQL-Programme so schnell wie möglich laufen? 1.2.066 / 4053 UEB-2 Übungen 1.2 UEB Aufgaben zu Kapitel 2 1. Deklarieren Sie eine Variable Provision als eine siebenstellige Zahl mit 2 Nachkommastellen. 2. Deklarieren Sie eine Variable my_aname, welche die Spalte dname der Tabelle dept des Benutzers SCOTT aufnehmen kann. 3. Welche zwei Vorteile bietet eine Variablendeklaration als %TYPE? 4. Welche Variablenbezeichner sind falsch? var_a _var_a 1_test p_insert insert var-a "UPdate" number; number; varchar2(10); varchar2(10); varchar2(10); number(9,-2); varchar2(10); 5. Geben Sie jeweils den Wert der Variablen i (Lieblingsvariable vieler Programmierer) an den Stellen 1,2,3 an. DECLARE i NUMBER; j NUMBER; BEGIN i := 10; BEGIN j := 7; Å 1 END; DECLARE i NUMBER :=17; BEGIN i := i + 2; Å 2 END; i:= i + j; Å 3 END; / 1.2.066 / 4053 UEB-3 Übungen UEB 6. Welche Blöcke lassen sich kompilieren/ausführen? a) declare gebtag date; GebTag date; begin null; end; / b) declare gebtag date:=sysdate; GebTag date:=sysdate+1; begin null; end; / c) . declare gebtag date:=sysdate; GebTag date:=sysdate+1; begin gebtag:=gebtag+1; end; / 1.2.066 / 4053 UEB-4 Übungen UEB 7. Finden Sie den/die Fehler: declare p_var p_var_2 p_var_3 sysdate nvarchar2(20); varchar2(20); varchar date; begin p_var := 10000; p_var_2 := 'Das ist ein Test'; dbms_output.put_line(p_var_2); p_var_2 := p_var_2 ||' vom '|| sysdate; dbms_output.put_line(p_var_2); end; / 1.2.066 / 4053 UEB-5 Übungen 1.3 UEB Aufgaben zu Kapitel 3 1. Schreiben Sie einen PL/SQL Block, der aus der Datenbank den Namen, das Gehalt und den Arbeitsort vom Mitarbeiter mit der Nummer 7839 auf den Bildschirm ausgibt. 2. Schreiben Sie einen Block, der drei Mitarbeiter in die EMP-Tabelle einträgt. Die Mitarbeiter sollen in der Abteilung arbeiten, die sich in New York befindet. Kann man nach Beendigung des Blocks noch einen Rollback durchführen? 3. Schreiben Sie einen Block, der das Gehalt aller Mitarbeiter in der Abteilung 20 erhöht, lesen Sie die Anzahl der geänderten Datensätze in eine Variable ein und lassen Sie sich diese am Bildschirm mit einer geeigneten Meldung ausgeben. 4. Welche der folgenden Skripte sind funktionstüchtig. Testen Sie es aus! BEGIN BEGIN GOTO test END; <<test>> NULL; END; / BEGIN GOTO test; BEGIN <<test>> NULL; END; END; / 1.2.066 / 4053 UEB-6 Übungen UEB BEGIN BEGIN GOTO test; END; BEGIN <<test>> NULL; END; END;. / 1.2.066 / 4053 UEB-7 Übungen 1.4 UEB Aufgaben zu Kapitel 4 1. Welche Anweisungen nach den IF-Abfragen werden im folgenden Programm abgearbeitet? a := b := c := IF b 1; NULL; NULL; IN (NULL,10,20) THEN .... /* Anweisung A */ END IF; IF a IN (NULL,1,2) THEN .... /* Anweisung B */ END IF; IF a NOT IN (NULL,10,20) THEN .... /* Anweisung C */ END IF; 2. Schreiben Sie einen anonymen Block, der einen Mitarbeiter auf sein Gehalt prüft. Wenn sein Gehalt <1500 ist, soll die Ausgabe "Kleines Gehalt", zwischen 1500 und 3500 die Ausgabe" Mittleres Gehalt" und bei mehr als 3500 die Ausgabe "Großverdiener" erscheinen. Der Mitarbeiter wird über seine Mitarbeiternummer dem Programm als Textersetzungsvariable übergeben (Zur Erinnerung: Dies geschieht durch Verwendung eines “&“ vor dem Variablennamen, z.B.: empno = &nummer;) 3. Schreiben Sie eine Schleife, die alle ganzzahligen, geraden Werte von -10 bis 10 ausgibt. Lösen Sie diese Aufgabe mit allen drei Schleifen. 4. Schreiben Sie eine Schleife, die beginnend bei der kleinsten Mitarbeiternummer der Tabelle emp die Mitarbeiternummern hochzählt und das zugehörige Gehalt jeweils um 10 % erhöht. Sobald 7 Datensätze geändert wurden, soll abgebrochen werden. 1.2.066 / 4053 UEB-8 Übungen 1.5 UEB Aufgaben zu Kapitel 5 1. Wie ist es möglich, einer Variablen den Datentyp einer ganzen Zeile einer Datenbanktabelle zuzuweisen? Geben Sie ein Beispiel! 2. Lesen Sie eine Zeile aus der EMP-Tabelle in einen Record ein. Können auch mehrere Zeilen in einem Record gespeichert werden? Geben Sie nun zwei beliebige Spaltenwerte aus dem Record aus. 3. Weisen Sie der Spalte deptno in der Record-Variablen aus der vorhergehenden Aufgabe den Wert 20 zu. 4. Erstellen Sie zunächst eine Tabelle ‘hilf‘ mit dem Befehl CREATE TABLE hilf AS SELECT * FROM emp; Hängen Sie nun eine Spalte an mit dem Befehl ALTER TABLE hilf ADD (nr number); Nun tragen Sie in die neue Spalte eine fortlaufende (!) Nummer ein. Schreiben Sie nun anhand dieser Tabelle einen PL/SQL-Block, in dem die Namen und Gehälter aller Mitarbeiter in eine PL/SQLTabelle eingelesen werden. 1.2.066 / 4053 UEB-9 Übungen 1.6 UEB Aufgaben zu Kapitel 6 1. Erstellen Sie einen Cursor, der jeden Mitarbeiter der emp-Tabelle mit Namen, Gehalt und Abteilungsnummer ausgibt. 2. Erstellen Sie nun ein Programm, das alle vorhandenen Abteilungen aus der dept-Tabelle ausliest und Mitarbeiter aus diesen Abteilungen mit Namen, Abteilungsnummer und Abteilungsort ausgibt. Es sollen keine Joins oder Subqueries benutzt werden. 3. Verwenden Sie innerhalb eines PL/SQL-Blockes einen Cursor, um die 5 bestbezahlten Mitarbeiter in die erst anzulegende Tabelle erg einzufügen. Die Tabelle erg hat folgenden Aufbau: Name Type ------------------ -----------GEHALT NUMBER(7,2) MITARBEITERNR NUMBER(4) MITARBEITERNAME CHAR(12) Außerdem sollen die Namen dieser Mitarbeiter in der Tabelle emp mit einem * markiert werden. (Anmerkung: Entfernen Sie bitte hinterher den Stern wieder mit ROLLBACK) 1.2.066 / 4053 UEB-10 Übungen 1.7 UEB Aufgaben zu Kapitel 7 1. Schreiben Sie einen Anonymen Block, der einen Gehaltswert eines Mitarbeiters aus der emp-Tabelle ausliest. Die Mitarbeiternummer soll dabei als Austauschvariable übergeben werden. Wenn die Nummer nicht existiert, soll eine entsprechende Fehlermeldung ausgegeben werden. 2. Schreiben Sie einen Anonymen Block, der Werte für empno, deptno, ename und sal in die Tabelle emp einfügt, die über Austauschvariablen eingelesen werden. Ist das angegebene Gehalt > 5000, so soll die Anweisung automatisch zurückgerollt und eine entsprechende Fehlermeldung ausgegeben werden. 3. Ergänzen Sie Aufgabe 2 dahingehend, dass im Fehlerbehandlungsteil auch auf die Eingabe einer unzulässigen deptno reagiert wird. Hinweis: Ermitteln Sie die passende Fehlernummer, indem Sie versuchen, einen Eintrag mit einer falschen deptno zu machen. 1.2.066 / 4053 UEB-11 Übungen 1.8 UEB Aufgaben zu Kapitel 8 1. Lösen Sie die Aufgabe 3 (inclusive 2) aus dem vorhergehenden Kapitel nun mit Hilfe einer Stored Procedure, an die die entsprechenden Werte als Parameter übergeben werden. 2. Erzeugen Sie in der Datenbank folgende Tabellen: Tabelle Verkauf: Spalte Type ------------------ -------NACHRICHT CHAR(45) DATUM DATE Tabelle Inventar: Spalte ------------------PROD_NR PRODUKT MENGE Type -------NUMBER(5) CHAR(15) NUMBER(5) Die Tabelle Verkauf ist leer, in die Tabelle Inventar fügen Sie folgende Daten ein: PROD_NR ---------------1234 8159 2741 PRODUKT MENGE ----------------------- ----------Rollschuh 3 Fußball 4 Barbie Puppe 2 Schreiben Sie eine Prozedur, die den Verkauf eines Rollschuhs in beiden Tabellen protokolliert. Bei Aufruf des Programms soll die Menge an Rollschuhen in der Tabelle Inventar um 1 vermindert werden, solange noch mindestens 1 Rollschuhpaar vorhanden ist. Der Verkauf eines Rollschuhpaares soll in der Tabelle Verkauf registriert werden. Falls keine Rollschuhe mehr vorhanden sind, soll dies ebenfalls in der Tabelle Verkauf vermerkt werden. 1.2.066 / 4053 UEB-12 Übungen UEB 3. Erstellen Sie eine PL/SQL-Prozedur, die das Einkommen (Gehalt + Provision) aller Mitarbeiter der Abteilung 30 ermittelt. Des Weiteren soll ermittelt werden, wie viele Mitarbeiter mehr als 2000,- Euro verdienen, und bei wie vielen Mitarbeitern die Provision höher als das Gehalt ist. 4. Schreiben Sie eine Prozedur, die das Gehalt aller Mitarbeiter um x% erhöht, wenn der Mitarbeiter weniger verdient, als der Durchschnitt in seiner Abteilung. x wird als Eingabeparameter übergeben. 5. Ihr Chef gibt Ihnen die Aufgabe, einige Informationen aus der Mitarbeitertabelle im Intranet darzustellen. Im ersten Schritt sollen jedoch die Ausgaben zu Testzwecken im SQL*Plus-Fenster erfolgen. Schreiben Sie dafür eine Prozedur mit einem Cursor, der nach Eingabe einer gewünschten Abteilung alle Mitarbeiter (empno, ename, deptno) der jeweiligen Abteilung ausgibt. 1.2.066 / 4053 UEB-13 Übungen 1.9 UEB Aufgaben zu Kapitel 9 1. Schreiben Sie eine Funktion, die aus einem eingegebenen String alle Ä durch Ae bzw. ä durch ae, Ö durch Oe bzw. ö durch oe, Ü durch Ue bzw. ü durch ue ersetzt. 2. Schreiben Sie eine Funktion, die das Gesamtgehalt (sal und comm) eines Mitarbeiters zurückgibt, wenn er in der Abteilung Nr. 10 arbeitet, ansonsten soll -1 zurückgegeben werden. 3. Schreiben Sie sich eine eigene String-Manipulations-Funktion. Diese Funktion soll vom Anfang oder vom Ende eines Strings eine bestimmte Anzahl von Zeichen wegschneiden Die Funktion hat drei Parameter (String, Anzahl der Zeichen, Vom Anfang an (1), oder vom Ende (-1)) Ein Aufruf von SELECT my_cutter('Das ist Text x',1,-1) FROM dual; soll folgende Ausgabe haben: --------------------Das ist Text 1.2.066 / 4053 UEB-14 Übungen 1.10 UEB Aufgabe zu Kapitel 10 Schreiben Sie ein Package emp_pack, das zwei Prozeduren und eine Funktion enthält: – Prozedur 1 fügt eine Zeile in die Tabelle emp ein (Spalten empno, ename, sal, hiredate und deptno); die Werte müssen als Parameter übergeben werden. – Prozedur 2 löscht einen Datensatz aus Tabelle emp; die empno wird als Parameter übergeben – Die Funktion überprüft eine Abteilungsnummer auf ihre Gültigkeit; sie wird von Prozedur 1 aufgerufen und soll nicht öffentlich sein. Falls die deptno ungültig ist, soll stattdessen NULL eingetragen werden. Testen Sie nun das Package. 1.2.066 / 4053 UEB-15 Übungen 1.11 UEB Aufgaben zu Kapitel 11 1. Definieren Sie einen Trigger auf die Tabelle emp, der keine Gehälter unter 1000 bzw. über 6000 zulässt. 2. Definieren Sie einen Trigger, der allen Benutzern den Zugriff auf die Tabelle dept (DELETE, INSERT, UPDATE) nur zwischen 08:00 und 17:00 Uhr erlaubt. 3. Erstellen Sie einen Trigger, der in der Tabelle Protokoll folgende Einträge bei einem Zugriff eines Benutzers auf die Mitarbeitertabelle protokolliert: Benutzernamen, verwendetes Statement und Datum. Die Tabelle Protokoll ist in folgender Form zu erzeugen: Benutzer VARCHAR2(30), Statement VARCHAR2(10), Datum DATE; 4. Legen Sie sich eine Kopie der Tabelle emp und dept an mit: create table emp_copy as select * from emp; create table dept_copy as select * from dept; Schreiben Sie einen Trigger, der bei Update auf die Abteilungsnummer in der dept_copy-Tabelle die Mitarbeiter in der emp_copyTabelle auf den gleichen neuen Wert setzt. Fügen Sie nun eine Spalte ysal zur Tabelle emp_copy hinzu. Wenn ein Mitarbeiter einen Eintrag in die sal-Spalte bekommt, soll das Jahresgehalt entsprechend mitgepflegt werden. 1.2.066 / 4053 UEB-16 Übungen UEB 5. Erledigen Sie folgende Aufgaben: a) Schreiben Sie einen Trigger der alle veränderten Zeilen der Tabelle mitdokumentiert. So sollen INSERT, UPDATE und DELETE in einer separaten Tabelle aufgezeichnet werden (emp_hist) emp_hist soll über die gleichen Spalten verfügen wie die Tabelle emp plus zusätzlich folgende Spalten: change_date (Änderungsdatum) change_nr (eindeutige Änderungsnummer aus Sequenz generiert) change_user (Benutzer der die Änderung durchgeführt hat) change_op (Welche DML-Operation wurde durchgeführt: INS, UPD, DEL) Bei einem UPDATE/DELETE soll die gesamte alte Zeile aufgezeichnet werden: Beispiel: insert into emp (empno,ename,job,sal,comm,deptno) values (9000,'HUBER','SALESMAN',3000,2000,20); update emp set sal=4000 where empno=9000; delete from emp where empno=9000; In der Tabelle emp_hist sollen nun folgende Einträge stehen: empno ename job sal comm dept no 9000 change_date change_nr <akt Datum> 2 SCOTT INS change_user change_op 9000 HUBER SALESMAN 3000 2000 20 <akt_datum> 3 SCOTT UPD 9000 HUBER SALESMAN 4000 2000 20 <akt_datum> 4 SCOTT DEL b) (*) Nun soll eine Routine geschrieben werden, die die DML- Operation auch nach einem COMMIT noch rückgängig machen soll. Bei Eingabe der change_nr wird diese Operation zurückgenommen (INSERT wird zu DELETE, DELETE zu INSERT und der UPDATE hat wieder die alten Werte). 1.2.066 / 4053 UEB-17 Übungen 1.12 UEB Aufgaben zu Kapitel 13 Übungen zu HTML-Prozeduren: 1. Erweitern Sie das Beispiel der Tabellendarstellung (siehe TheorieTeil) um folgende Punkte: a) Es soll eine Auswahlliste aller verfügbaren Tabellen des Benutzers (all_tables) in einer SELECT-Liste dargestellt werden Tipp: Bei fehlerhaften HTML-Seiten sehen sich den Quell-Code der Seite an (Iexplorer: rechte Maustaste, Quelltext anzeigen) b) Nun soll der letzte benutzte Tabellenname als Default-Eintrag in der Select Liste erscheinen. Übungen zu DBMS_LOB 2. Erstellen Sie eine Prozedur, die das Alertfile aus der Datenbank ausliest. Der Name dieser Datei lautet orclALRT.log. Den Pfad erhalten Sie, wenn Sie in der View v$parameter den Wert (value) für den Parameter background_dump_dest (Spalte: name) suchen. Eine Auswertung des Pfades soll dynamisch erfolgen! Informationen aus dieser Datei sollen in eine Tabelle geschrieben werden: CREATE TABLE msta_alertfile (line NUMBER, prio NUMBER, datum DATE, text VARCHAR2(4000)); Vergeben Sie an den Entwickler die notwendigen Rechte (Tabelle, Directory) GRANT CREATE ANY DIRECTORY TO user; GRANT SELECT ANY TABLE TO user; 3. Übung zu UTL_FILE: Scheiben Sie eine Prozedur, die die Emp-Tabelle in eine Datei sichert. 1.2.066 / 4053 UEB-18 Übungen 1.13 UEB Zusatzaufgaben 1. Übung Schreiben Sie einen anonymen Block, der einen Mitarbeiter auf sein Gehalt prüft. Wenn sein Gehalt <1500 ist, soll die Ausgabe "Kleines Gehalt", zwischen 1500 und 3500 die Ausgabe "Mittleres Gehalt" und bei mehr als 3500 die Ausgabe "Großverdiener" erscheinen. Der Mitarbeiter wird über seine Mitarbeiternummer dem Programm als Textersetzungsvariable übergeben. 2. Übung Berechnen Sie die Umstellung auf den Gregorianischen Kalender. Tipp 1: Bei der Umstellung auf diesen Kalender wurden einige Tage übersprungen und sind auch in der Datenbank nicht vorhanden. Beispiel: Wenn der Kalender am 12.8. umgestellt wurde, wären der 13.8. und 14.8. nicht verfügbar. Wird der Datenbank einer dieser beiden Tage übergeben, bekommen Sie z.B. den 20.8. zurück. Tipp 2: Die Umstellung erfolgte zwischen dem 2.01.1500 und dem 01.01.1600. Tipp 3: Die Umstellung erfolgte zwischen dem 3ten und 28ten eines Monats. 3. Übung Schreiben Sie die drei Mitarbeiter mit dem Beruf Manager in eine vorher anzulegende Tabelle (top_verdiener mit name und gehalt). Die Werte der Spalten sollen zuerst in einem PL/SQL Array gespeichert werden, bevor sie in die Tabelle geschrieben werden. Anmerkung: Es gibt nur einen Manager je Abteilung (10,20,30). 1.2.066 / 4053 UEB-19 Übungen UEB 4. Übung Schreiben Sie einen anonymen Block, der alle Mitarbeiter mit Namen und Gehalt in ein PL/SQL Array einliest und dann wieder ausgibt. Tipp: Holen Sie die kleinste Mitarbeiternummer und dann immer die nächsthöhere (vergebene) Nummer. 5. Übung Verwenden Sie innerhalb eines PL/SQL-Blockes einen Cursor, um die 5 bestbezahltesten Mitarbeiter in die erst anzulegende Tabelle erg einzufügen. Die Tabelle erg hat folgenden Aufbau: Name Typ ---------------------- -----------GEHALT NUMBER(7,2) MITARBEITERNR NUMBER(4) MITARBEITERNAME VARCHAR2(12) Außerdem sollen die Namen dieser Mitarbeiter in der Tabelle emp mit einem * markiert werden. (Anmerkung: Entfernen Sie bitte hinterher den Stern wieder mit ROLLBACK) 1.2.066 / 4053 UEB-20 Übungen UEB 6. Übung Ihr DBA bittet Sie um Mithilfe. Er möchte alle Tabellen analysieren, die bisher noch nicht analysiert worden sind. Um die Belastung des Rechners in Grenzen zu halten, schlägt er folgendes Vorgehen vor: Es sollen nur Tabellen des Benutzers SCOTT und SYSTEM analysiert werden. Wenn die Tabelle mehr als 100 Blöcke besitzt, soll eine 5% Stichprobe durchgeführt werden, zwischen 16 und 100 Blöcken sollen 20% der Tabelle analysiert werden, ansonsten die komplette Tabelle. Sie können zum Testen noch ein paar Tabellen anlegen. z. B.: CREATE TABLE small_emp AS SELECT e.* FROM scott.emp e,scott.emp, scott.emp; CREATE TABLE big_emp AS SELECT e.* scott.emp; FROM scott.emp e,scott.emp, scott.emp, Tipp: Sie können z. B. die Tabellen dba_segments, dba_tables oder dba_extents verwenden. Schauen Sie sich zuerst die Syntax des ANALYZE TABLE und dbms_ddl Befehls an. 1.2.066 / 4053 UEB-21