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