Plan wykładu Bazy danych Wykład 9: Programowanie aplikacji baz danych po stronie serwera Sekwencje Wyzwalacze Bloki anonimowe Funkcje Procedury Pakiety Małgorzata Krtowska Katedra Oprogramowania e-mail: mmac@ii.pb.bialystok.pl Bazy danych (studia dzienne) 2 Perspektywy cd CREATE [ OR REPLACE] VIEW nazwa_perspektywy [kolumna1, kolumna2,...] AS zapytanie WITH READ ONLY; kady uprawniony uytkownik moe tylko oglda dane o pracownikach bez moliwoci wstawiania, modyfikowania czy usuwania wierszy Złczenia tabel select * from emp, dept where emp.deptno=dept.deptno; select * from emp NATURAL JOIN dept; select * from emp JOIN dept USING (deptno); Select prac.ename, kier.ename as mgr from emp prac, emp kier where prac.mgr=kier.empno; Select prac.ename, kier.ename as mgr» from emp prac JOIN emp kier ON prac.mgr=kier.empno; Bazy danych (studia dzienne) 3 Bazy danych (studia dzienne) 4
Złczenia zewntrzne Powtórzenie: Złczenie zewntrzne rozszerza rezultat prostego złczenia o te wiersze z jednej tabel, dla których w trakcie złczania nie znaleziono odpowiadajcych im wierszy w drugiej tabeli. SQL> select ename, dept.deptno, dname from emp, dept where emp.deptno (+) =dept.deptno and dept.deptno in (30,40); ENAME DEPTNO DNAME ---------- ---------- -------------- ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 40 OPERATIONS Złczenia zewntrzne cd Złczenie zewntrzne mona realizowa równie w oparciu o struktur LEFT JOIN, RIGHT JOIN, FULL JOIN Przykład. Wypisz wszystkich pracowników podajc dla kadgo z nich nazw działu, w którym pracuje. Select empno, ename, dname from emp left join dept on emp.deptno=dept.deptno; wypisuje wszystkich pracowników, gdy pracownik nie ma przypisanego działu w miejsce dname pojawia si warto NULL Bazy danych (studia dzienne) 5 Bazy danych (studia dzienne) 6 Złczenia zewntrzne cd Przykład Wypisz wszystkie działy, dla kadego z nich podajc sumaryczne zarobki zatrudnionych w nim pracowwników. Select dept.deptno, dname, sum(sal) from emp right join dept on emp.deptno=dept.deptno group by dept.deptno, dname; gdy w dziale nie ma adnego pracownika w pozycji Sum (sal) bdzie warto NULL Struktura bloku w PL/SQL [DECLARE deklaracje] Przykład Select empno, ename, dname from emp full join dept on emp.deptno=dept.deptno; połczenie LEFT JOIN i RIGHT JOIN - zostan wypisane departamenty bez pracowników i pracownicy bez departamentów. [EXCEPTION Bazy danych (studia dzienne) 7 Bazy danych (studia dzienne) 8
Wykonanie bloku w PL/SQL Struktura bloku w PL/SQL / [DECLARE deklaracje] [EXCEPTION START nazwa_pliku @nazwa_pliku Uruchomienie bloku załadowanego do bufora RUN / zmienne, stałe, kursory, wyjtki zdefiniowane przez uytkownika instrukcje jzyka SQL instrukcje sterujce PL/SQL działania, które maj by podjte w razie wystpienia błdów Bazy danych (studia dzienne) 9 Bazy danych (studia dzienne) 10 Zmienne i stałe Typy danych ZMIENNA: identyfikator typ_danych [NOT NULL] [:=wart_pocz DEFAULT wart_pocz]; STAŁA: identyfikator CONSTANT typ_danych [:=wart_pocz DEFAULT wart_pocz]; zmienna%type tabela.kolumna%type tabela%rowtype Bazy danych (studia dzienne) 11 Bazy danych (studia dzienne) 12
Instrukcja warunkowa Instrukcja iteracyjna LOOP IF warunek THEN instrukcja-1; END IF; IF warunek THEN instrukcja-1; ELSE instrukcja-2; END IF; LOOP instrukcje; EXIT [WHEN warunek]; END LOOP; WHILE warunek LOOP instrukcje; END LOOP; IF warunek-1 THEN instrukcja-1; ELSIF warunek-2 THEN instrukcja-2; ELSE instrukcja-3; END IF; Bazy danych (studia dzienne) 13 FOR licznik IN [REVERSE] min..max LOOP instrukcje; END LOOP; Bazy danych (studia dzienne) 14 Przetwarzanie wyników zapyta SELECT lista INTO nazwa_zmiennej nazwa_rekordu FROM tabela; Obsługa wyjtków Wystpienie błdu systemu ORACLE wyjtki predefiniowane wyjtki nie-predefiniowane Jawne wywołanie sytuacji wyjtkowej przez uytkownika przez instrukcj RAISE Bazy danych (studia dzienne) 15 Bazy danych (studia dzienne) 16
Sekwencje Sekwencje Obiekty bazy danych uywane do generowania unikatowych wartoci (zwykle na potrzeby kluczy głównych) Dostp do kolejnych wartoci umoliwiaj pseudokolumny NEXTVAL (zwraca warto zwikszon w kolejnym kroku) CURVAL (zwraca bieac warto) CREATE SEQUENCE nazwa_sekwencji [ INCREMENT BY warto START WITH warto {MAXVALUE warto NOMAXVALUE} {MINVALUE warto NOMINVALUE } {CYCLE NOCYCLE } ] Bazy danych (studia dzienne) 17 Bazy danych (studia dzienne) 18 Sekwencje ALTER SEQUENCE nazwa_sekwencji [ INCREMENT BY warto {MAXVALUE warto NOMAXVALUE} {MINVALUE warto NOMINVALUE } {CYCLE NOCYCLE } ] Wyzwalacze Procedury składowane w bazie danych, automatycznie uruchamiane przez system przy wystpieniu okrelonego zdarzenia w bazie danych Uycie: tworzenie niestandardowych wizów integralnoci, złoonych funkcji monitorujcych działania uytkowników,... Bazy danych (studia dzienne) 19 Bazy danych (studia dzienne) 20
Wyzwalacze (liczba wykonanych akcji) Wyzwalacze wierszowe: akcja wykonywana jest tyle razy, ile jest wierszy, których dotyczy polecenie aktywujce wyzwalacz Wyzwalacze poleceniowe: akcja wykonywana jest tylko jeden raz, niezalenie od iloci wierszy, których dotyczy polecenie aktywujce wyzwalacz Tworzenie wyzwalaczy CREATE OR REPLACE TRIGGER nazwa_wyzwalacza { BEFORE AFTER INSTEAD OF } { DELETE INSERT UPDATE [ OF kolumna, [, kolumna ] ] } [ OR { DELETE INSERT UPDATE [ OF kolumna, [, kolumna ] ] } ] ON tabela [ FOR EACH ROW [ WHEN (warunek) ] ] blok pl/sql Bazy danych (studia dzienne) 21 Bazy danych (studia dzienne) 22 Rodzaje wyzwalaczy (czas wykonania) Wyzwalacze przeprowadzajce okrelon akcj przed wykonaniem polecenia, które aktywizuje wyzwalacz Wyzwalacze przeprowadzajce akcj po wykonaniu polecenia, które aktywizuje wyzwalacz Stare i nowe wartoci wierszy INSERT new UPDATE new, old DELETE old :identyfikator.kolumna Bazy danych (studia dzienne) 23 Bazy danych (studia dzienne) 24
Modyfikowanie wartoci Włczanie i wyłczanie wyzwalaczy BEFORE Mona zmienia wartoci new ALTER TRIGGER nazwa_wyzwalacza { ENABLE DISABLE} AFTER Nie mona zmienia wartoci new ALTER TRIGGER nazwa_wyzw ENABLE; ALTER TRIGGER nazwa_wyzw DISABLE; Bazy danych (studia dzienne) 25 Bazy danych (studia dzienne) 26 Podprogramy Składniki podprogramu Procedury do przeprowadzenia akcji Funkcje do obliczania wartoci Pakiety do zbierania logicznie powizanych procedur i funkcji Nagłówek podprogramu [deklaracje] [EXCEPTION Bazy danych (studia dzienne) 27 Bazy danych (studia dzienne) 28
Podprogramy [CREATE OR REPLACE] PROCEDURE nazwa_procedury [ (parametr [, parametr ] )] IS [deklaracje] [EXCEPTIONS END [nazwa_procedury]; Podprogramy [CREATE OR REPLACE] FUNCTION nazwa_funkcji [(parametr [, parametr ] )] RETURN nazwa_typu IS [deklaracje] [EXCEPTIONS END [nazwa_funkcji]; Bazy danych (studia dzienne) 29 Bazy danych (studia dzienne) 30 Tryby parametrów podprogramów Wywoływanie procedur/funkcji rodowisko Argument IN Argument OUT Argument IN OUT EXECUTE nazwa_procedury[(parametry)] [deklaracje] EXECUTE zmienna:= nazwa_funkcji[(parametry)] [EXCEPTION Bazy danych (studia dzienne) 31 Bazy danych (studia dzienne) 32
Wywoływanie procedur/funkcji - przykład Specyfikacja pakietu EXECUTE mod_cene(1, 5); VARIABLE g_vat NUMBER EXECUTE :g_vat := wyznacz_vat(1); PRINT g_vat CREATE [OR REPLACE] PACKAGE nazwa_pakietu AS deklaracje publiczne specyfikacje podprogramów Bazy danych (studia dzienne) 33 Bazy danych (studia dzienne) 34 Tworzenie ciała pakietu CREATE [ OR REPLACE ] PACKAGE BODY nazwa_pakietu AS deklaracje prywatne definicje podprogramów [ instrukcje inicjalizujce pakietu] Bazy danych (studia dzienne) 35