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