Laboratorium 4
Transkrypt
Laboratorium 4
Laboratorium 4
Sekwencje, procedury, funkcje, wykorzystywanie zmiennych i kursorów
Składnia procedur i funkcji
CREATE [OR REPLACE]
PROCEDURE nazwa [(par1 [ IN | OUT | IN OUT ] typ
[, par1 [ IN | OUT | IN OUT ] typ, ...])]
{IS|AS}
[deklaracje;]
BEGIN
instrukcje;
[EXCEPTION
obsluga_wyjatkow;]
END [nazwa];
CREATE [OR REPLACE]
FUNCTION nazwa [(par1 [ IN | OUT | IN OUT ] typ
[, par1 [ IN | OUT | IN OUT ] typ, ...])]
RETURN typ {IS|AS}
[deklaracje;]
BEGIN
instrukcje;
RETURN wyrazenie;
[EXCEPTION
obsluga_wyjatkow;]
END [nazwa];
Wywoływanie procedur i funkcji:
CALL nazwa(5);
BEGIN
nazwa(5);
END;
DECLARE
v_napis VARCHAR2(50);
BEGIN
v_napis := nazwa(5);
dbms_output.put_line(v_napis);
END;
CALL dbms_output.put_line('Hello World');
Zadanie 1
Utworzyć procedurę HELLO wyświetlającą dowolny napis. Przetestować jej działanie.
Zadanie 2
a) Utworzyć procedurę WITAJ z dwoma parametrami (imię oraz wiek), która wywołana
WITAJ('Ala', 12) wyświetli 12 razy napis:
Witaj Ala, masz 12 lat. Przetestować jej działanie.
b) Następnie dodać do niej wyjątek NIEPOPRAWNY_WIEK, który będzie zgłaszany jeśli podany wiek
będzie mniejszy od 0 lub większy od 120. Przetestować działanie.
c) Wychwycić zgłaszany wyjątek i wyświetlić użytkownikowi odpowiednią informację w jakich
granicach ma być wiek osoby.
Zadanie 3
Stworzyć sekwencje ZD_SEQ o wartości startowej nie mniejszej niż największe ID_ZAJECIA z tabeli
ZAJECIA_DODATKOWE. Utworzoną sekwencję ZD_SEQ przetestować dodając do tabeli
ZAJECIA_DODATKOWE jeden wiersz (w miejsce ID_ZAJECIA wykorzystać sekwencję).
Zadanie 4
a) Utworzyć procedurę DODAJ_ZAJECIA z dwoma parametrami (rodzaj zajęć i cena), która wywołana
np.: DODAJ_ZAJECIA('malarstwo',7.0); doda do tabeli ZAJĘCIA_DODATKOWE wiersz z
podanym rodzajem zajęć i ceną. Jako wartość klucza głównego tej tabeli wykorzystać sekwencję z
poprzedniego zadania. Przetestować.
b) Rozbudować procedurę DODAJ_ZAJECIA o następujące elementy:
• wyświetlanie wszystkich danych z wiersza, który został dodany,
• w przypadku próby dodania jeszcze raz rodzaju zajęć, który już istnieje (klucz UNIQUE na
kolumnie RODZAJ), użytkownikowi powinna się wyświetlić odpowiednia informacja (obsługa
wyjątku DUP_VAL_ON_INDEX).
Oczywiście przetestować :)
Zadanie 5
Utworzyć funkcję CZESNE liczącą opłaty miesięczne dziecka o podanym jako argument
ID_DZIECKA. Poniższe zapytanie:
SELECT id_dziecka,imie,nazwisko,CZESNE(id_dziecka) FROM DZIECI;
powinno wyświetlić listę dzieci razem z czesnym jakie muszą zapłacić.
Dla ułatwienia proponuję zrobić to zadanie stopniowo.
Napisać funkcje o poniższych nazwach, które dla danego parametru ID_DZIECKA zwrócą odpowiednie
wartości:
a) CZESNE1(id_dziecka) – zwróci wartość opłaty na komitet rodzicielski
b) CZESNE2(id_dziecka) – zwróci wartość opłaty na komitet rodzicielski + opłata za posiłki
c) CZESNE3(id_dziecka) – zwróci wartość opłaty na komitet rodzicielski + opłata za posiłki + opłaty za
zajęcia dodatkowe dziecka o danym id
d) CZESNE4(id_dziecka) – zwróci wartość opłaty na komitet rodzicielski + opłata za posiłki + opłaty za
zajęcia dodatkowe dziecka o danym id + opłaty za godziny dodatkowe, które dziecko spędziło w
przedszkolu (zakładamy, że mamy dane tylko z tego miesiąca)
e) CZESNE5(id_dziecka) – zwróci wartość opłaty na komitet rodzicielski + opłata za posiłki + opłaty
za zajęcia dodatkowe dziecka o danym id + opłaty za godziny dodatkowe, które dziecko spędziło w
przedszkolu (zakładamy, że mamy dane tylko z tego miesiąca). Uwzględnić dodatkowo:
• że dziecka o podanym id nie ma w ogóle w bazie – należy utworzyć odpowiedni wyjątek,
wywołać go, wychwycić i wyświetlić odpowiednią informację użytkownikowi, w takim
wypadku funkcja powinna zwracać NULL
• uwzględnić, że któreś z dzieci może nie mieć żadnych zajęć dodatkowych albo godzin
dodatkowych – w takich przypadkach do czesnego ma się doliczać wartość 0 (trzeba dodać
warunek na brak wyników z zapytaniu SELECT)
f) CZESNE6(id_dziecka, miesiac_rok) – można jeszcze bardziej rozwinąć funkcję, żeby liczyła czesne
uwzględniając opłaty za godziny dodatkowe wpłacone tylko w podanym miesiącu :)
Po wszystkim można sprawdzić jak działają nasze funkcje:
SELECT
SELECT
SELECT
SELECT
SELECT
id_dziecka,imie,nazwisko,CZESNE1(id_dziecka)
id_dziecka,imie,nazwisko,CZESNE2(id_dziecka)
id_dziecka,imie,nazwisko,CZESNE3(id_dziecka)
id_dziecka,imie,nazwisko,CZESNE4(id_dziecka)
id_dziecka,imie,nazwisko,CZESNE5(id_dziecka)
FROM
FROM
FROM
FROM
FROM
DZIECI;
DZIECI;
DZIECI;
DZIECI;
DZIECI;
Warto też porównać wyniki działania tych funkcji z perspektywą utworzoną na poprzednim
laboratorium.