1 Czy podany blok anonimowy języka PL/SQLSQL jest
Transkrypt
1 Czy podany blok anonimowy języka PL/SQLSQL jest
PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 1. Czy podany blok anonimowy języka PL/SQLSQL jest poprawny? Wskaż ewentualne błędy, o ile takie istnieją, z krótkim uzasadnieniem. DECLARE z_OsobaId osoby.Id%TYPE; z_Nazwisko osoby.nazwisko%TYPE; z_Imie osoby.imie1%TYPE; z_LiczbaOsob NUMBER; CURSOR k_WszystkieOsoby IS SELECT DISTINCT Id, Nazwisko||’ ‘||Imie1 PelneDane, INITCAP(SUBSTR(Nazwisko,1,1))||’.‘|| SUBSTR(INITCAP(Imie1),1,1)||’.’ Inicjaly FROM osoby; BEGIN SELECT COUNT(Id) Licz_os INTO z_LiczbaOsob FROM osoby; DBMS_OUTPUT.PUT_LINE(‘Osoba ‘||z_LiczbaOsob); OPEN k_WszystkieOsoby FETCH k_WszyskieOsoby INTO z_Nazwisko, z_Imie FOR i IN k_WszystkieOsoby LOOP EXIT WHEN k_WszystkieOsoby %NOTFOUND; DBMS_OUTPUT.PUT_LINE(‘Osoba ‘||i.Id||‘. ‘||i.PelneDane||’ ma inicjały ‘||i.Inicjaly); END LOOP; CLOSE k_WszystkieOsoby; END; / Zadanie 2. Czy podany blok anonimowy języka PL/SQLSQL jest poprawny? Zadaniem bloku jest wskazanie osoby najmłodszej wśród osób, jakie mogą być wpisane do tabeli osoby. Wskaż ewentualne błędy, o ile takie istnieją, z krótkim uzasadnieniem. DECLARE z_id osoby.id%TYPE :=1; z_nazwisko osoby.nazwisko%TYPE; z_imie osoby.imie1%TYPE; z_data_ur osoby.d_ur%TYPE; BEGIN SELECT id, INITCAP(Nazwisko)||’ ‘||INITCAP(Imie1) Osoba, d_ur INTO z_id, z_nazwisko, z_imie, z_data_ur FROM osoby WHERE d_ur IN (SELECT DISTINCT MIN(d_ur) FROM osoby); DBMS_OUTPUT.PUT_LINE (‘Osoba najmłodsza to‘||‘ ‘||z_id||’ ‘||z_nazwisko||’ ‘||z_imie); EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO dziennik_bledow (informacja) VALUES (‘Błąd w programie!’); END; / 1 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 3. Mamy wykorzystać wyzwalacz DML do zapisu wszystkich obserwacji wszystkich działań wykonywanych na tabeli Zatrudnienia. W tym celu należy utworzyć tabelę Zapis, w której będą gromadzone zapisy o podjętych działaniach na tabeli Zatrudnienia. Wyzwalacz powinien posiadać obsługę błędu, w której należy zaprojektować wyświetlanie popełnionego błędu. Zadanie 4. Mamy napisać kod programu PL/SQL, w którym każda wybrana osoba będzie przydzielona do odpowiedniej grupy wynagrodzeń: I grupa – poniżej 800 zł, II grupa – do 801 do 1100 zł, III grupa – od 1101 do 1400 zł, itd. co 200 zł, po 2000 zł co 500 zł aż do 6000 zł, a wszystkie powyżej do XII grupy. Uzupełnij poniższy kod, aby zrealizować to zadanie. DECLARE z_IdOsoba osoby.id%TYPE; z_Komunikat VARCHAR2(15); CURSOR k_osoba IS … BEGIN FOR z_Osoba IN k_osoba LOOP ... DBMS_OUTPUT.PUT_LINE (‘Osoba o identyfikatorze ‘ || z_Osoba.id || ‘ należy do grupy wynagrodzeń ‘||z_Komunikat); ... EXCEPTION … INSERT INTO dziennik_bledow (informacja) VALUES (‘Osoba o danym identyfikatorze nie pracuje lub jej nie znaleziono!’); END; / Zadanie 5. Napisano program, który będzie podawał dla wybranej osoby komunikat, w którym miesiącu się ona urodziła. Komunikat ma być podany następująco: Osoba o identyfikatorze 7 urodziła się w kwartale (nr kwartału słownie). Wskaż ewentualne błędy, o ile takie istnieją, z krótkim uzasadnieniem. DECLARE z_IdOsoba osoby.id%TYPE :=7; z_Miesiac CHAR(2); z_Komunikat VARCHAR2(60); BEGIN SELECT Id, TO_CHAR(D_ur, ‘MM’) INTO z_IdOsoba, z_Miesiac FROM osoby WHERE Id=z_IdOsoba; SELECT ‘Osoba o identyfikatorze ‘||z_IdOsoba||’ urodziła się ‘||DECODE(z_Kwartal, ‘1’, ‘pierwszym’, ‘2’, ‘drugim’, ‘3’, ‘trzecim’, ‘4’, ‘czwartym’)||’ kwartale!’ INTO z_komunikat DBMS_OUTPUT.PUT_LINE (z_Komunikat); EXCEPTION END; / 2 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 6. Podnieść pensje aktualnie najdłużej pracującemu mężczyźnie: a) na wydziale danym poprzez nazwę wydziału zadeklarowaną w zmiennej PL/SQL • bez wykorzystania kursora jawnego • z wykorzystaniem kursora jawnego b) na dowolnym wydziale. Zadanie 7. Napisać kod bloku anonimowego w języku PL/SQL, za pomocą którego będzie można wybrać osobę bez podwyżki, która aktualnie najdłużej pracuje na każdym z wydziałów. Zadanie 8. Mamy wprowadzić przy wykorzystaniu kursora jawnego do tabeli o nazwie tabela_tymcz id osoby aktualnie pracującej wraz z następującym komunikatem Pan/i jest zatrudniony/a od tutaj pojawia się data zatrudnienia. Ponieważ komunikat ten może być wprowadzany dowolną liczbę razy, jako klucz główny tabeli tabela_tymcz przyjąć pole, które będzie wprowadzane za pomocą sekwencji l_p zwiększanej co 1 startując od 1 bez wartości max. Zadanie 9. Zaprojektować blok anonimowy PL/SQL z obsługą błędów za pomocą wyjątków predefiniowanych, którego zadaniem jest wyświetlenie tych wszystkich aktualnie zatrudnionych osób, których długość imienia jest dłuższa niż z góry ustalona liczba. Rozważyć wszystkie możliwe błędy, jakie w tej sytuacji mogą mieć miejsce. Ponadto zaprojektować obsługę dowolnego błędu, przy czym zastosować w niej możliwość wprowadzenia do tabeli tabela_błędów(kod_błędu, komunikat) kodu błędu i komunikatu związanego z tym błędem. Następnie zagnieździć dany blok z obsługą błędów i dokonać propagacji obsługi wyjątków do nadbloku. Zadanie 10. Zaprojektować blok anonimowy PL/SQL, za pomocą którego zostanie wyświetlona dla poszczególnych lat w rozbiciu na miesiące począwszy od bieżącego roku aż do roku zatrudnienia najwcześniej zatrudnionej osoby liczba osób zatrudnionych. Zaprojektować obsługę błędów dla przypadku, gdy w danym miesiącu danego roku nie ma nikogo zatrudnionego poprzez wpisanie komunikatu o tym: W roku ... miesiąc ... liczba zatrudnionych - 0! Jako drugi wariant zadania obsługa błędów ma polegać na wpisaniu do tabeli tabela_komunikatow(komunikat) tego powyższego hasła w przypadkach, gdy nikogo nie zatrudniono w danym okresie. Zadanie 11. Mamy zaprojektować procedurę, która dla każdego roku poda największą w nim wypłacaną pensję oraz największą wypłacaną pensję aktualnie pracującej osobie. Zadanie 12. Mamy zaprojektować funkcję, która dla dowolnej osoby będzie obliczać wartość aktualnej pensji za cały rok kalendarzowy. Uwzględnić przypadek, gdy osoba jest wpisana do tabeli osoby, lecz jeszcze nie ma wypłacanej pensji. Zadanie 13. Zaprojektować funkcję, która będzie obliczać różnicę pomiędzy średnią pensją mężczyzn i kobiet na wybranym wydziale. Uwzględnić przypadek, gdy na danym wydziale są zatrudnione osoby tylko jednej płci lub nie ma nikogo zatrudnionego. 3 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 14. Mamy zaprojektować procedurę i funkcję obliczenia najdłuższego imienia na podanym wydziale. Następnie wywołać napisany blok proceduralny za pomocą odpowiedniej instrukcji SQL i wydrukować wynik. Zadanie 15. Mamy zaprojektować procedurę obliczenia stażu pracy (liczba lat, miesięcy i dni) na danym wydziale dowolnej osoby zatrudnionej na podanym wydziale. Zadanie 16. Mamy wykorzystać wyzwalacz DML do zapisu wszystkich obserwacji wszystkich działań wykonywanych na tabeli Zatrudnienia. W tym celu należy utworzyć tabelę Zapis(Id_zapis, Akcja, Id_klucz, Data_zapisu, Nazwa_uzytkownika), w której będą gromadzone zapisy o podjętych działaniach na tabeli Zatrudnienia. Struktura tabeli Zapis jest następująca: a. Id_zapis – pole wskazujące na kolejny zapis, generowane za pomocą sekwencji o kroku 1, bez wartości maksymalnej b. Akcja – pole przyjmuje wartości: „Insert” – gdy wstawiamy rekord do tabeli, „Update” – gdy jest aktualizowany rekord oraz „Delete” – gdy rekord jest usuwany. c. Id_klucz – wartość w polu klucza głównego rekordu, który jest aktualnie modyfikowany instrukcją DML, d. Data_zapisu – data wykonania operacji DML na tabeli Zatrudnienia e. Nazwa_użytkownika – dane użytkownika wykonującego operację DML. Wyzwalacz powinien posiadać obsługę błędu, w której należy zaprojektować wyświetlanie popełnionego błędu. Zadanie 17. Do bazy wprowadzona jest osoba, która jak się okazało ma niepoprawne dane, gdyż jej data zatrudnienia jest późniejsza niż data zwolnienia. Należy zaprojektować wyzwalacz, który uniemożliwi wprowadzanie tego typu błędnej informacji i wprowadzi daty poprawnie - na odwrót, tzn. data zwolnienia jest późniejsza niż data zatrudnienia. Zaprojektować dwa typy wyzwalaczy: a) pierwszy, który dokona podmiany tych danych przed ich wprowadzeniem, b) drugi, który dokona odpowiedniej ich aktualizacji po operacji ich wprowadzenia do tabeli Zadanie 18. Mamy zaprojektowaną perspektywę OsobaPensja będącą złączeniem dwóch tabel: osoby i pensje. Struktura tej perspektywy jest następująca: OsobaPensje(pensje.id, pensje.id_os, osoby.nazwisko, osoby.imie1, pensje.od, pensje.pensja). Mamy zaprojektować wyzwalacz, który umożliwi wprowadzenie danych do tych tabel za pomocą tej perspektywy. Zadanie polega na wstawieniu danych, które zmieniają datę od i wartość pensji w tabeli pensje podanej osobie. Powiedzmy, iż Lis Anna zatrudniona 01/10/2001 ma aktualną pensję w wysokości 2000 zł. Dane te zostały wpisane przez pomyłkę i chcemy je zmodyfikować wprowadzając do perspektywy OsobaPensja rekord: INSERT INTO OsobaPensja(id, id_os, nazwisko, imie1, od, pensja) VALUES(8, 5,‘Lis’, ‘Anna’, TO_DATE(‘19/06/2002’,’DD/MM/YYYY’), 2030); W ten sposób za pomocą tego rekordu chcemy zaktualizować niepoprawne dane w polach od i pensja dla tej osoby. Zaprojektować wyzwalacz, przy pomocy którego to zadanie zostanie wykonane, tzn. wartości pól od i pensja zostaną zaktualizowane na nowe. 4 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 19. Mamy zaprojektować odpowiedni wyzwalacz, który będzie umożliwiał wypełnienie tabeli pensje następną liczbą z sekwencji przy wprowadzeniu nowego rekordu do tej tabeli Zadanie 20. Mamy utworzyć tabele i typy danych, które zamodelują kolekcję danych dotyczącą wycieczek uczniów w oparciu o dane przedstawione w poniższych tabelach. Klucze główne każdej tabeli są oznaczone czcionką pogrubioną. Następnie zaprojektować w tak utworzonej kolekcji następujące zapytania, przy pomocy których uzyskamy następujące informacje: • dla każdego organizatora wycieczek wylistować ponumerowaną listę wycieczek organizowanych przez danego organizatora w następujący sposób: PTTK Ziemi Kieleckiej jest organizatorem następujących wycieczek: 30 IV Cross Górski 60 III Rajd szlakiem Orlich Gniazd 70 IX Rajd wiosenny Juventur jest organizatorem następujących wycieczek: 20 Kazimierz Dolny 40 Trójmiasto PTTK Ziemi Łódzkiej jest organizatorem następujących wycieczek: 10 V Rajd po Ziemi Łódzkiej 50 Kraków i okolice • dla wybranej wycieczki podać ponumerowaną listę uczestników tej wycieczki, np.: Lista uczniów - uczestników wycieczki - V Rajd po Ziemi Łódzkiej : 1. Kraska Adam 2. Rosiak Monika 3. Adamczyk Elżbieta WYCIECZKI KOD_W 10 20 30 40 50 60 70 80 90 99 NAZWA V Rajd po Ziemi Łódzkiej Kazimierz Dolny IV Cross górski Trójmiasto Jura Krakowska III Rajd szlakiem Orlich Gniazd IX Rajd wiosenny Italia klasyczna Zwiedzanie Berlina X Rajd wiosenny 5 RODZAJ piesza autokarowa rowerowa autokarowa autokarowa rowerowa piesza autokarowa autokarowa piesza PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak KOD_UCZ 108 202 301 400 501 600 777 800 855 902 NR_ORG 1 2 3 4 KOD_W 10 20 30 40 50 60 70 80 90 99 UCZNIOWIE NAZWISKO IMIE Nowak Jerzy Kraska Adam Rosiak Monika Czapliński Mateusz Adamczyk Elżbieta Daniec Katarzyna Kraczycki Piotr Matysek Iwona Barczyk Katarzyna Dominiak Marek DATA_UR 12.09.1989 14.11.1989 02.04.1988 05.05.1988 09.07.1987 02.06.1988 09.12.1988 12.10.1987 19.03.1988 21.08.1988 ORGANIZATORZY NAZWA ORGANIZATOR_WYCIECZEK PTTK Ziemi Kieleckiej 30 60 70 99 Juventur 10 50 PTTK Ziemi Łódzkiej 20 40 Triada 80 90 UDZIAL WYPADEK UDZIAL_UCZNIA • • • • • • • • • • bez wypadku bez wypadku złamane 2 nogi bez wypadku bez wypadku złamana ręka bez wypadku bez wypadku choroba lokomocyjna zwichnięta noga 6 udz_tab 202 301 777 400 600 108 501 600 202 301 777 400 600 108 501 600 400 777 108 501 600 301 501 400 777 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 21. Mamy zaprojektować pakiet zawierający: ♦ procedurę wyświetlenia osób podanej płci aktualnie zatrudnionych na wskazanym wydziale, przy czym komunikat ma mieć treść: „Na wydziale (należy podać jego nazwę) jest aktualnie zatrudniona Pan/i (podać nazwisko i imię) o id (podać id)”. ♦ procedurę wyświetlającą, kto ma jakiego szefa na wskazanym wydziale, przy czym komunikat ma mieć treść: „Szefem osoby (podać nazwisko i imię) o id (podać id) aktualnie zatrudnionej na wydziale (należy podać jego nazwę) jest (podać nazwisko i imię) o id (podać id) ♦ procedurę wyświetlania najdłużej zatrudnionej osoby na danym wydziale, która nadal pracuje. Zadanie 22. Zaprojektować blok proceduralny, którego zadaniem jest wyświetlenie roku i miesiąca, w którym liczba zatrudnionych na danym poprzez nazwę wydziale była największa. Następnie uruchomić nazwany blok PL/SQL za pomocą instrukcji SQL i wynik wydrukować. Zadanie 23. Który szef i którego wydziału najwięcej zarabia. Zaprojektować blok proceduralny, który umożliwi wyświetlenie tego faktu. Zadanie 24. Zaprojektować funkcje, która będzie obliczała różnicę pomiędzy aktualnie najmniejszą i największą pensją na danym wydziale. Zadanie 25. Zaprojektować blok PL/SQL, który będzie wyświetlał alfabetyczne listy osób zatrudnionych na poszczególnych wydziałach, przy czym w nagłówku każdej listy ma być podana nazwa wydziału. Zadanie 26. Czy podany blok anonimowy języka PL/SQLSQL jest poprawny? Wskaż ewentualne błędy, o ile takie istnieją, z krótkim uzasadnieniem. DECLARE z_id osoby.Id%TYPE; z_nazwisko osoby.nazwisko%TYPE; z_imie osoby.imie1%TYPE; licznik BINARY_INTEGER:=1; BEGIN CURSOR k_osoby IS SELECT id, nazwisko, imie1, plec FROM osoby; OPEN k_osoby; LOOP FETCH k_osoby INTO z_id, z_nazwisko, z_imie, z_plec; EXIT WHEN k_osoby %NOTFOUND; DBMS_OUTPUT.PUT_LINE(‘Osoba ‘||id||’ to ‘||nazwisko||’ ‘||imie); licznik:=licznik+1; END LOOP; CLOSE k_osoby; END; / 7 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 27. Mamy utworzyć tabele i typy danych, które zamodelują kolekcję danych dotyczącą egzaminów studentów w oparciu o dane przedstawione w poniższych tabelach. Klucze główne każdej tabeli są oznaczone czcionką pogrubioną. PRZEDMIOTY NAZWA L_GODZ_WYKL Analiza matematyczna 4 Bazy danych 2 Historia starożytna 3 Algebra 4 Metody numeryczne 2 Historia Polski 4 Funkcje rzeczywiste 4 KOD_P 10 20 30 40 50 60 70 ID 1 2 3 4 5 6 7 STUDENCI NAZWISKO Nowak Kraska Rosiak Czapliński Adamczyk Daniec Kraczycki L_GODZ_CW 4 2 0 2 2 0 2 IMIE Jerzy Adam Monika Mateusz Elżbieta Katarzyna Piotr WYDZIALY NAZWA Matematyki Historii Matematyki KOD_P 10 20 30 40 50 60 70 KIERUNEK Matematyka Dydaktyka historii Informatyka WYKAZ_EGZAMINOW 10 40 70 30 60 20 50 WYKAZ_EGZAMINOW DATA_EGZ ZDAWANY_PRZEZ • • • • • • • 23/01/2001 25/06/2001 15/06/2001 20/01/2001 21/01/2001 19/01/2001 29/01/2001 8 st_tab 1 3 5 4 7 2 6 1 3 5 4 7 2 6 3 5 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Następnie, po utworzeniu kolekcji należy zaprojektować programy PL/SQL, za pomocą których uzyskamy następujące informacje: • W utworzonej powyżej kolekcji zaprojektować procedurę, której zadaniem jest listy egzaminów na poszczególnych kierunkach, przy czym sposób przedstawienia tych informacji jest następujący: Egzaminy na wydziale Historii dla kierunku Historia : 30 Historia starożytna 60 Historia Polski Egzaminy na wydziale Matematyki dla kierunku Matematyka : 10 Analiza matematyczna 40 Algebra 70 Funkcje rzeczywiste Egzaminy na wydziale Matematyki dla kierunku Informatyka : 20 Bazy danych 50 Metody numeryczne • W utworzonej powyżej kolekcji zaprojektować procedurę, której zadaniem jest wyświetlenie listy studentów, którzy zdawali konkretny egzamin, przy czym sposób przedstawienia tych informacji jest następujący (przykładowo dla egzaminu „Analiza matematyczna”): Studenci, którzy zdawali egzamin z przedmiotu - Analiza matematyczna : 1. Nowak Jerzy 2. Rosiak Monika 3. Adamczyk Elżbieta Zadanie 28 Zaprojektowano wyzwalacz DML, który będzie sprawdzał, czy podczas wprowadzania rekordu data zwolnienia jest późniejsza niż data zatrudnienia. Jeśli tak nie jest, daty powinny być zamienione. Jak zadziała ten wyzwalacz w momencie wykonania instrukcji INSERT i UPDATE, skoro zaprojektowano go w postaci jak poniżej: CREATE OR REPLACE TRIGGER OdDo BEFORE UPDATE ON zatrudnienia FOR EACH ROW DECLARE z_od zatrudnienia.od%TYPE; z_do zatrudnienia.do%TYPE; BEGIN SELECT od, do INTO z_od, z_do FROM zatrudnienia WHERE id=:old.id; IF z_od > :new.do OR :new.od>z_do THEN RAISE_APPLICATION_ERROR(-20000,’Data zwolnienia wcześniejsza niż data zatrudnienia!’); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(‘Brak danych!’); END; / Jak poradzić sobie z takim efektem działania tego wyzwalacza? 9 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 29 Napisać kod bloku anonimowego w języku PL/SQL, za pomocą którego będzie wyświetlony komunikat o każdej sobie wraz z jej inicjałami za pomocą pętli prostej. Czy podany blok jest poprawny. Jeśli tak, jaki będzie wynik jego działania. Jeśli nie podaj wszystkie błędy, przy czym odpowiedź należy uzasadnić podając rodzaj błędu. DECLARE z_lp z_id z_PelneDane z_Inicjaly z_LiczbaOsob BINARY_INTEGER:= 1; osoby.Id%TYPE; VARCHAR2(60); CHAR(4); BINARY_INTEGER; BEGIN LOOP SELECT COUNT(id) liczba_osob INTO z_LiczbaOsob FROM osoby; DBMS_OUTPUT.PUT_LINE(‘Numer ‘||z_Licznik); SELECT DISTINCT Id, Nazwisko||’ ‘||Imie1, SUBSTR(Nazwisko,1,1)||’.‘|| SUBSTR(Imie1,1,1)||’.’ INTO z_OsobaId, z_PelneDane, z_Inicjaly FROM Osoby WHERE Id=z_OsobaId; DBMS_OUTPUT.PUT_LINE(z_lp||‘. Osoba ‘||z_PelneDane||’ ma inicjały ‘||z_Inicjaly); z_lp:= z_lp + 1; IF z_lp > liczba_osob THEN EXIT; END IF; END LOOP; END; / Zadanie 30 Zaprojektować nazwany blok PL/SQL, który będzie obliczał liczbę osób aktualnie zatrudnionych na zadanym wydziale o imieniu na zadaną literę. Nie jest dozwolone w celu skonstruowania tego nazwanego bloku PL/SQL używać jakiegokolwiek widoku. Blok główny, w którym zostanie wywołany zaprojektowany nazwany blok PL/SQL powinien mieć postać: DECLARE z_litera CHAR(1):=’A’; z_nazwa wydzialy.nazwa%TYPE:=’Matematyka’; z_LiczbaOsob NUMBER; BEGIN z_LiczbaOsob:=LiteraWydzial(z_litera, z_nazwa); DBMS_OUTPUT.PUT_LINE(‘Liczba osób o imieniu na literę ||z_litera||’ na wydziale ‘||z_nazwa||’ wynosi – ‘||z_LiczbaOsob); END; / 10 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 31 Dopisz linie kodu w miejsca wykropkowane (o ile to konieczne) w poniższym bloku anonimowym PL/SQL tak, aby wyświetlić wszystkie aktualnie zatrudnione osoby zatrudnione w określonym kwartale, np. w pierwszym. Można wykorzystać tylko już zadeklarowane zmienne PL/SQL-owe DECLARE z_nazwisko osoby.nazwisko%TYPE; z_imie osoby.imie1%TYPE; z_od zatrudnienia.od%TYPE; z_kwartal NUMBER:=1 licznik BINARY_INTEGER:=1; z_lp NUMBER:=1; z_LiczbaOsob NUMBER; CURSOR k_OsobyZatr IS SELECT a.nazwisko, a.imie1, b.od FROM osoby a, zatrudnienia b WHERE a.id=b.id_os AND b.do IS NULL; BEGIN … DBMS_OUTPUT.PUT_LINE(‘Osoba zatrudnione w kwartale :’||z_kwartal); ... LOOP ... DBMS_OUTPUT.PUT_LINE(z_lp||‘. ‘||z_nazwisko||’ ‘||z_imie); ... END LOOP; … END; / Zadanie 32 Zaprojektować obsługę wszystkich możliwych błędów dla poniższego bloku PL/SQL. DECLARE z_osoba z_id z_kwartal BEGIN osoby%ROWTYPE; osoby.id%TYPE:=’A’; NUMBER:=5; BEGIN SELECT * INTO z_osoba FROM osoby WHERE id=z_id OR TO_CHAR(d_ur,’Q’)=z_kwartal; EXCEPTION; ... EXCEPTION … END; / 11 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 33 Mamy zaprojektować nazwany blok PL/SQL, który umożliwi wyświetlenie nazwy każdego wydziału, a ponadto nazwisko i imię oraz datę zatrudnienia najdłużej aktualnie zatrudnionej na nim osoby: Zadanie 34 Mamy zaprojektować nazwany blok PL/SQL, który umożliwia obliczenie liczby zatrudnionych osób w zadanym miesiącu i zadanym roku, przy czym należy uwzględnić obsługę przypadku, gdy w zadanym okresie żadna osoba nie została zatrudniona. Zadanie 35 Chcemy wyświetlić najmłodszą osobę aktualnie zatrudnioną z każdej płci, przy czym ograniczamy się tylko do osób zatrudnionych w roku 1999 lub 2000. Czy działanie podanego poniżej bloku anonimowego języka PL/SQL jest poprawne i daje pożądany rezultat? Jeśli tak, to jaki będzie wynik jego działania. Jeśli nie, należy wskazać wszystkie ewentualne błędy, o ile takie istnieją, przy czym odpowiedź należy uzasadnić opisując rodzaj wymienionych błędów. DECLARE z_id osoby.Id%TYPE; z_nazwisko osoby.nazwisko%TYPE; z_imie osoby.imie1%TYPE; z_plec osoby.plec%TYPE; licznik BINARY_INTEGER:=1; CURSOR k_osoby IS SELECT plec, MAX(d_ur) max_urodz FROM osoby a, zatrudnienia b WHERE a.id=b.id_os AND do IS NULL AND TO_CHAR(od,’YYYY’)=1999 OR TO_CHAR(od,’YYYY’)=2000; BEGIN FOR k_osoby IN z_osoba LOOP; EXIT WHEN k_osoby %FOUND; IF z_osoba.plec=’K’ THEN DBMS_OUTPUT.PUT_LINE(‘Najmłodsza kobieta jest urodzona ‘||z_osoba.max_urzodz); ELSIF DBMS_OUTPUT.PUT_LINE(‘Najmłodszy mężczyzna jest urodzony ‘||z_osoba.max_urzodz); END IF; END LOOP; END; / Zadanie 36 Zaprojektować kursor jawny, którego zadaniem jest podniesienie aktualnej pensji o 10% wszystkim aktualnie zatrudnionym kobietom o aktualnej pensji mniejszej niż średnia ze wszystkich aktualnych pensji. Zadanie 37 Zaprojektować nazwany blok PL/SQL, za pomocą którego można wyświetlić wszystkie najpóźniej zatrudnione osoby na zadanym wydziale. Następnie należy za pomocą odpowiedniej instrukcji SQL-owej wywołać dany podprogram PL/SQL-owy, a wynik wydrukować. 12 PLSQL – przykładowe zadania zaliczeniowe – dr Tadeusz Antczak Zadanie 38 Mamy zaprojektować funkcję, która dla zadanego wydziału poda nam informację o procencie zatrudnionych osób na danym wydziale w stosunku do wszystkich zatrudnionych. Nie wolno wykorzystywać widoków w konstrukcji tej funkcji. Blok główny, z którego jest ona wywoływana powinien mieć postać: DECLARE z_procent NUMBER; BEGIN z_procent:=ProcentZatrudWydzial(z_nazwa); DBMS_OUTPUT.PUT_LINE(‘Liczba zatrudnionych na wydziale ‘||z_nazwa||’ stanowi ‘||z_procent||’% ogółu aktualnie zatrudnionych); END; / Zadanie 39 Zaprojektować wyzwalacz DML, który uniemożliwi w sposób ciągły będzie aktualizował tabelę LiczbaPodwyzek, w której jest zawarta informacja o liczbie podwyżek każdej osoby. Zadanie 40 Zaprojektowano procedurę wyświetlania danych wyświetlania danych najkrócej i najdłużej aktualnie zatrudnionej osoby określonej płci. Czy jest ona poprawna? Jeśli nie, należy wskazać wszystkie ewentualne błędy, o ile takie istnieją, przy czym odpowiedź należy uzasadnić opisując rodzaj wymienionych błędów. CREATE OR REPLACE PROCEDURE ZatrPlec(p_plec IN CHAR) IS z_nazwisko osoby.nazwisko%TYPE; z_imie1 osoby.imie1%TYPE; z_od zatrudnienia.od%TYPE; p_plec osoby.plec%TYPE; BEGIN SELECT a.nazwisko, a.imie1 Osoba, b.od INTO z_nazwisko, z_imie1, z_od FROM Zatrudnienia b JOIN Osoby a ON a.Id=b.Id_os WHERE plec=p_plec AND b.Od=(SELECT MIX(Od) FROM Osoby e, Zatrudnienia d WHERE e.id=d.id_os AND Plec=p_plec); DBMS_OUTPUT.PUT_LINE(‘Najkrócej jest zatrudniona ‘||z_nazwisko||’ ‘||z_imie1||’ zatrudniona od ‘||z_od); UNION SELECT a.nazwisko, a.imie1, b.Od INTO z_nazwisko, z_imie1, z_od FROM Zatrudnienia b JOIN Osoby a ON a.Id=b.Id_os WHERE plec=p_plec AND b.Od=(SELECT MAX(Od) FROM Osoby e, Zatrudnienia d WHERE e.id=d.id_os AND Plec=p_plec); DBMS_OUTPUT.PUT_LINE(‘Najdłużej jest zatrudniona ‘||z_nazwisko||’ ‘||z_imie1||’ zatrudniona od ‘||z_od); END; / 13