Wyzwalacze
Transkrypt
Wyzwalacze
PODSTAWY BAZ DANYCH 13. PL/SQL 2009/2010 - Notatki do wykładu "Podstawy baz danych" 1 Wprowadzenie do języka PL/SQL Język PL/SQL - rozszerzenie SQL o elementy programowania proceduralnego. Możliwość wykorzystywania: – zmiennych i stałych, – instrukcji sterujących IF, – pętli, – kursorów, – wyjątków. Podstawowa jednostka w PL/SQL: blok - grupuje logicznie powiązane deklaracje i wyrażenia. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 2 Struktura bloku (programu) PL/SQL Struktura bloku: – część deklaracji zmiennych i stałych – opcjonalna – część wykonywalna – część obsługi wyjątków – opcjonalna [ DECLARE ] … BEGIN … [ EXCEPTION ] … END; -- deklaracje zmiennych, stałych i kursorów -- wyrażenia -- obsługa wyjątków 2009/2010 - Notatki do wykładu "Podstawy baz danych" 3 Komentarze Komentarz zawierający jedną linię - znaki -- Komentarz wieloliniowy - znaki /* ... */ Komentarze nie mogą być zagnieżdżone BEGIN -- Wykonaj procedurę X X; /* Teraz wykonaj procedurę Y i zakończ działanie program */ Y; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 4 Podstawowe typy Typ numeryczny NUMBER[(precyzja, skala)] Typy znakowe CHAR[(maks_długość)] VARCHAR2(maks_długość) Inne typy BOOLEAN - typ logiczny, wartości: TRUE, FALSE, NULL DATE – data ... typy zdefiniowane przez programistę. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 5 Zmienne Zmienne zmienne proste (np. numeryczne, znakowe, logiczne, …) zmienne złożone – zmienne rekordowe – tablice – obiekty (ang. objects) /*rozszerzenie obiektowe Oracle */ – … 2009/2010 - Notatki do wykładu "Podstawy baz danych" 6 Deklarowanie zmiennych i stałych DECLARE nazwa_zmiennej typ; … Przykłady. DECLARE licznik number(4); znak char(1); flaga boolean := TRUE; osoba osoby.nazwisko%TYPE; Nadanie wartości zmiennym: licznik := 10; znak := 'A'; flaga := TRUE; osoba := 'Lis'; Definiowanie stałych: DECLARE nazwa_zmiennej CONSTANT typ := wartość; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 7 Rekordy - przykład DECLARE TYPE osoba_dane IS RECORD ( nazwisko VARCHAR2(20), imie VARCHAR2(20) ); p osoba_dane ; … BEGIN ... p.nazwisko := 'Nowak'; p.imie:= 'Jan'; ... END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" /* typ rekordowy */ /* zmienna typu rekordowego */ /* dostęp do pól rekordu */ 8 Instrukcja SELECT INTO .......... DECLARE v_nazwisko VARCHAR2(20); v_imie1 VARCHAR2(20); BEGIN SELECT nazwisko, imie1 INTO v_nazwisko, v_imie1 FROM osoby WHERE id = 1; END; • Zapytanie w języku SQL musi zwrócić dokładnie jeden wiersz. • Klauzula INTO wskazuje na zmienne, które zostaną wypełnione wartościami odczytanymi przez zapytanie. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 9 Instrukcja warunkowa IF .................. IF warunek1 THEN ... /* wykonaj polecenia */ [ ELSIF warunek2 THEN ... /* wykonaj polecenia */ ......................] [ ELSIF warunekn THEN ... ] /* wykonaj polecenia */ [ ELSE ... ] /* wykonaj polecenia */ END IF; Operatory logiczne: OR, AND, NOT. IF (x = 1 AND y) OR (x = 2 AND NOT y) THEN … ... END IF; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 10 Pętle Pętla podstawowa (nieskończona) LOOP … [ EXIT WHEN warunek; ] … END LOOP; /* polecenia */ /* polecenia */ Pętla WHILE warunek LOOP … … END LOOP; 2009/2010 - Notatki do wykładu "Podstawy baz danych" /* polecenia */ 11 Pętle Pętla numeryczna FOR FOR zmienna_licznikowa IN [REVERSE] x..y LOOP … … /* polecenia */ END LOOP; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 12 Kursor Każde zapytanie SQL umieszczone w programie PL/SQL jest wykonywane w tzw. obszarze roboczym (kursor). Serwer bazy danych wykorzystuje ten obszar (kursor) do przechowywania danych otrzymanych w wyniku zapytania oraz do przechowywania innych dodatkowych informacji dotyczących stanu wykonywanego zapytania. Kursor (ang. umożliwiającym: – – – – cursor) jest konstruktorem PL/SQL nadanie nazwy temu obszarowi, dostęp do niego, pobranie z niego danych, kontrolę procesu przetwarzania danych. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 13 Operacje na kursorze Podstawowe operacje na kursorze: • deklaracja kursora • otwarcie kursora • pobranie wartości z kursora • zamknięcie kursora • CURSOR nazwa [(parametr_1, parametr_2, ...)] IS zapytanie; • OPEN nazwa [(wart_param_1, wart_param_2, ..)]; • FETCH nazwa INTO lista_zmiennych; • CLOSE nazwa; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 14 Kursor - Przykład DECLARE CURSOR pracownik_kursor IS SELECT id_os, nazwisko, imie1 FROM osoby; Osoba_id osoby.id_os%TYPE; osoba_nazwisko osoby.nazwisko%TYPE; osoba_imie1 osoby.imie1%TYPE; pracownik_dane pracownik_kursor%ROWTYPE; BEGIN OPEN pracownik_kursor; FETCH pracownik_kursor INTO osoba_id, osoba_nazwisko, osoba_imie1; FETCH pracownik_kursor INTO pracownik_dane; CLOSE pracownik_kursor; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 15 Kursor – Pętla FOR z kursorem lub z podzapytaniem Pętla FOR z kursorem FOR zmienna_rekord IN kursor LOOP … /* polecenia */ END LOOP; nie wymaga otwarcia ani zamknięcia kursora. Nie wymaga również deklaracji zmiennej zmienna_rekord. Pętla FOR z podzapytaniem FOR zmienna_rekord IN (podzapytanie_SQL) LOOP … … /* polecenia */ END LOOP; W celu iteracyjnego przetwarzania wyników zapytania nie jest konieczne jawne deklarowanie kursora. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 16 Procedury i funkcje składowane W PL/SQL można tworzyć własne procedury i funkcje. Cechy: – przechowywane w bazie danych, – postać skompilowana - zwiększenie szybkości działania, – ułatwiają pielęgnowanie aplikacji, – mogą być współdzielone przez wielu użytkowników. Procedury i funkcje można gromadzić w pakietach. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 17 Procedury i funkcje składowane Przykład 1. Przykład funcji. DROP FUNCTION f; CREATE OR REPLACE FUNCTION f(x NUMBER) RETURN NUMBER IS y NUMBER; BEGIN y:=x*x; RETURN y; END; / Przykład 2. Przykład wykorzystania funkcji w bloku PL/SQL. DECLARE wynik NUMBER; BEGIN wynik:= f(4); DBMS_OUTPUT.PUT_LINE(wynik); DBMS_OUTPUT.PUT_LINE(f(4)); END; / 2009/2010 - Notatki do wykładu "Podstawy baz danych" 18 Procedury i funkcje składowane Przykład 3. Przykład procedury. DROP PROCEDURE p; CREATE OR REPLACE PROCEDURE p(x IN NUMBER, w IN OUT NUMBER) IS y NUMBER; BEGIN y:=x*w; w:=y; END; / Przykład 4. Przykład wykorzystania procedury w bloku PL/SQL. DECLARE wynik NUMBER; BEGIN wynik:=6; p(4,wynik); DBMS_OUTPUT.PUT_LINE(wynik); END; / 2009/2010 - Notatki do wykładu "Podstawy baz danych" 19 PODSTAWY BAZ DANYCH 14. Wyzwalacze (database triggers) 2009/2010 - Notatki do wykładu "Podstawy baz danych" 20 Wyzwalacze Wyzwalacze bazy danych (database triggers) - procedury składowane w bazie danych w powiązaniu z konkretną relacją (tabelą) i są automatycznie uruchamiane w momencie wykonania polecenia SQL dotyczącego tej relacji. Z relacją może być związanych wiele rożnych wyzwalaczy (z pewnymi ograniczeniami), ale pojedynczy wyzwalacz może być związany tylko z jedną relacją. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 21 Wyzwalacze – Moment uruchamiania W zależności od czasu uruchamiania wyzwalaczy możemy je podzielić na dwie grupy: • AFTER - wykonywane po wykonaniu polecenia SQL. • BEFORE - wykonywane przed wykonaniem polecenia SQL; Uruchamiane są przy wykonywaniu poleceń SQL: INSERT, UPDATE, DELETE. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 22 Wyzwalacze - budowa CREATE [ OR REPLACE ] TRIGGER nazwa { AFTER | BEFORE } { DELETE | INSERT | UPDATE } [ OF lista_atrybutów ] ON nazwa_relacji [ FOR EACH ROW [ WHEN warunek ] ] [ DECLARE … BEGIN … END; /* deklaracja zmiennych, . . . */ ] /* ciało wyzwalacza */ 2009/2010 - Notatki do wykładu "Podstawy baz danych" 23 Wyzwalacze - ograniczenia W ciele wyzwalacza można stosować polecenia SQL, PL/SQL i wywoływać podprogramy (procedury i funkcje). Ograniczenia: • nie można stosować poleceń DDL; • nie można stosować poleceń sterujących transakcjami COMMIT, ROLLBACK, SAVEPOINT; • wywoływać podprogramy z wyżej wymienionymi poleceniami. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 24 Wyzwalacze - Przykład Osoby Id_os Nazwisko Imie1 Imie2 Adam D_ur Plec 11-10-1970 M 1 Kowalski Jan 2 Nowak Anna 01-10-1980 K 3 Norek Tadeusz 05-09-1980 M Zatrudnienia Id_z Id_os Id_w Id_s Od 1 2 1 1 01-10-1990 2 3 3 2 01-10-2000 3 3 3 2 01-11-2001 2009/2010 - Notatki do wykładu "Podstawy baz danych" Do Pensja 1200 30-10-2001 1600 2000 25 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test1 AFTER UPDATE ON zatrudnienia BEGIN DBMS_output.put_line('placa została zmieniona'); END; Komunikat będzie wyświetlony przy zmianie dowolnego atrybutu pierwszej aktualizowanej krotki. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 26 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test2 AFTER UPDATE OF pensja ON zatrudnienia BEGIN DBMS_output.put_line('placa została zmieniona'); END; Komunikat będzie wyświetlony przy zmianie tylko atrybutu „pensja” pierwszej aktualizowanej krotki. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 27 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test3 AFTER UPDATE OF pensja ON zatrudnienia FOR EACH ROW BEGIN DBMS_output.put_line('placa została zmieniona'); END; Komunikat będzie wyświetlony przy zmianie tylko atrybutu „pensja” każdej aktualizowanej krotki. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 28 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test4 AFTER UPDATE OF pensja ON pensje FOR EACH ROW WHEN placa>1000 BEGIN DBMS_output.put_line('placa została zmieniona'); END; Komunikat będzie wyświetlony przy zmianie tylko atrybutu „pensja” każdej aktualizowanej krotki, w której wartość atrybutu >1000. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 29 Wyzwalacze Ten sam wyzwalacz może być uruchamiany przez każde polecenie DML: INSERT, UPDATE, DELETE lub ich dowolną kombinację. W tym samym momencie nie może być uruchamianych więcej jak jeden wyzwalacz. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 30 Wyzwalacze CREATE [ OR REPLACE ] TRIGGER nazwa { AFTER | BEFORE } DELETE OR INSERT OR UPDATE [ OF lista_atrybutów] ON nazwa_relacji [ FOR EACH ROW [ WHEN warunek ] ] [ DECLARE … /* deklaracja zmiennych, . . . */ ] BEGIN … /* ciało wyzwalacza */ END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 31 Wyzwalacze W ciele i w warunku można korzystać z dwóch kwalifikatorów (qualifier) NEW i OLD, które przyjmują nową i starą wartość krotki: NEW.nazwa_atrybutu OLD.nazwa_atrybutu Dla wyzwalacza uruchamianego poleceniem INSERT wartość kwalifikatora OLD przyjmuje wartość NULL dla każdego atrybutu krotki. Dla wyzwalacza uruchamianego poleceniem DELETE wartość kwalifikatora NEW przyjmuje wartość NULL dla każdego atrybutu krotki. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 32 Wyzwalacze Dla wyzwalacza uruchamianego poleceniem UPDATE wyzwalacz ma dostęp do starej i nowej wartości atrybutu. Odwołania do kwalifikatorów NEW i OLD w klauzuli WHEN nie są poprzedzone „:” NEW.nazwa_atrybutu w pozostałych odwołaniach poprzedzone jest „:”. :NEW.nazwa_atrybutu 2009/2010 - Notatki do wykładu "Podstawy baz danych" 33 Wyzwalacze - przykład Przykład. Poprawianie pisowni. CREATE OR REPLACE TRIGGER test5 BEFORE INSERT ON osoby FOR EACH ROW BEGIN :NEW.nazwisko:=InitCap(:NEW.nazwisko); :NEW.imie1:=InitCap(:NEW.imie1); :NEW.imie2:=InitCap(:NEW.imie2); END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 34 Wyzwalacze - przykład Przykład. Wyzwalacz nadający kolejny numer pobrany z licznika licz_osoby wprowadzanej nowej krotki do relacji osoby. CREATE OR REPLACE TRIGGER test6 BEFORE INSERT ON osoby BEGIN SELECT licz_osoby.Nextval INTO :NEW.id_os FROM DUAL; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 35 Wyzwalacze - przykład Przykład. Przy wprowadzaniu nowej krotki do relacji zatrudnienia zrobić aktualizację poprzedniej pensji (atrybut do). CREATE OR REPLACE TRIGGER bi_zatrudnienia BEFORE INSERT ON zatrudnienia FOR EACH ROW BEGIN SELECT licz_zatrudnienia.NEXTVAL INTO :NEW.id_z FROM DUAL; :NEW.od:=SYSDATE; UPDATE zatrudnienia SET do=SYSDATE-1 WHERE id_os=:NEW.id_os AND do IS NULL; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 36 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test7 BEFORE INSERT OR UPDATE ON osoby FOR EACH ROW BEGIN :NEW.nazwisko:=InitCap(:NEW.nazwisko); :NEW.imie1:=InitCap(:NEW.imie1); :NEW.imie2:=InitCap(:NEW.imie2); END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 37 Wyzwalacze - przykład Przykład. CREATE OR REPLACE TRIGGER test8 BEFORE INSERT OR UPDATE ON osoby FOR EACH ROW WHEN NEW.nazwisko <> InitCap(NEW.nazwisko) BEGIN ... END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 38 Wyzwalacze - przykład CREATE OR REPLACE TRIGGER test9 BEFORE INSERT ON zatrudnienia FOR EACH ROW BEGIN IF :NEW.pensja < 500 THEN DBMS_output.put_line('mało ????????????'); END IF; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 39 Wyzwalacze Ciało wyzwalacza, które może być uruchamiane przez więcej niż jedno polecenie DML, może zawierać tzw. predykaty warunkowe: inserting, deleting, updating. 2009/2010 - Notatki do wykładu "Podstawy baz danych" 40 Wyzwalacze CREATE [ OR REPLACE ] TRIGGER nazwa {AFTER | BEFORE} DELETE OR INSERT OR UPDATE [OF atrybuty] ON nazwa_relacji [ FOR EACH ROW [ WHEN warunek ] ] DECLARE … BEGIN ..................... IF INSERTING THEN .....................END IF; IF UPDATING [lista_atrybutów] THEN .....................END IF; IF DELETING THEN .....................END IF; ....................... END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 41 Wyzwalacze Predykaty można łączyć za pomocą AND, OR NOT w tej samej klauzuli IF IF UPDATING OR DELETING THEN ... END IF; IF UPDATING( lista_atrybutów1 ) OR UPDATING( lista_atrybutów2 ) THEN ................ END IF; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 42 Wyzwalacze - przykład CREATE OR REPLACE TRIGGER test10 BEFORE INSERT OR UPDATE ON osoby FOR EACH ROW BEGIN IF INSERTING THEN :NEW.nazwisko:=InitCap(:NEW.nazwisko); :NEW.imie1:=InitCap(:NEW.imie1); :NEW.imie2:=InitCap(:NEW.imie2); END IF; IF UPDATING('nazwisko') THEN :NEW.nazwisko:=InitCap(:NEW.nazwisko); END IF; END; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 43 Wyzwalacze Zmiana wyzwalacza ALTER TRIGGER nazwa DISABLE [ENABLE]; ALTER TABLE nazwa_relacji DISABLE [ENABLE] ALL TRIGGERS; Kasowanie wyzwalaczy DROP TRIGGER nazwa; Informacje o wyzwalaczach można znaleźć w widokach: SELECT * FROM USER_TRIGGERS; 2009/2010 - Notatki do wykładu "Podstawy baz danych" 44