Z bloku kodu można zrobić funkcję (FUNCTION
) lub
procedurą (PROCEDURE
). Różnica jest taka, że funkcje
zwracają jakiś wynik, a procedury nie.
Funkcje można wykonywać tylko w kontekście zapytania, np.
SELECT foo(a,b,c) FROM Dual;
spowoduje wykonanie funkcji
foo
z parametrami
a
, b
, c
i wypisanie wyniku
w tabeli.
Procedury wykonuje się przy pomocy słowa kluczowego
EXECUTE
, np.
EXECUTE proc(x,y);
spowoduje wykonanie funkcji
proc
z parametrami
x
oraz y
.
Każdy parametr procedury można oznaczyć jako wejściowy
(IN
), wyjściowy (OUT
) lub
wejściowo-wyjściowy (IN OUT
).
Składnia | Przykład |
---|---|
CREATE [OR REPLACE] PROCEDURE nazwa [(par1,par2,...)] IS
|
CREATE OR REPLACE PROCEDURE foo (par IN NUMBER DEFAULT 10) IS
|
CREATE [OR REPLACE] FUNCTION nazwa [(par1,par2,...)]
|
CREATE OR REPLACE FUNCTION bar (par IN NUMBER) IS
|
Wyzwalacze to procedury wywoływane autoamtycznie przez bazę danych w momencie gdy zajdzie pewne zdarzenie.
Składnia | Przykład | Uwagi |
---|---|---|
CREATE [OR REPLACE] TRIGGER nazwa
|
CREATE OR REPLACE TRIGGER LogujWstawienie
|
Wyzwalacz
Klauzula |
Można napisać jedną procedurę dla INSERT
,
UPDATE
i DELETE
na raz, pisząc:
Przykład |
---|
CREATE OR REPLACE TRIGGER LogujWstawienie
|
Wewnątrz ciała wyzwalacza można odwoływać się do aktualnie
zmienianego wiersza (dotyczy tylko wyzwalaczy z klauzulą FOR
EACH ROW
) za pomocą specjalnych zmiennych :NEW
oraz :OLD
, np.
Przykład |
---|
CREATE OR REPLACE TRIGGER WstawIdentyfikator
|
Zmienna :NEW
odwołuje się do nowej wartości
zmienianego wiersza, zaś :OLD
do starej
wartości. Jedynie przy operacji UPDATE
obydwie
zmienne mają sens. Przy INSERT
oraz
DELETE
jedna ze zmiennych będzie miała wartość
NULL
.
Klauzula WHEN (...)
pozwala wywołać wyzwalacz tylko
jeśli zachodzi dodatkowy warunek, np.
Przykład |
---|
CREATE OR REPLACE TRIGGER WstawIdentyfikator
|
Warto zwrócić uwagę, że NEW
wewnątrz klauzuli
WHEN
nie jest poprzedzone
dwukropkiem.
Napisz wyzwalacz, który zrealizuje połączenie między
tabelami Zespoly
oraz
Pracownicy
. Połączenie to ma być typu "jeden
do wiele". Aktualnie tabela Pracownicy
sprawdza czy w tabeli Zespoly
istnieje
odpowiedni wpis gdy chcemy zmienić pole
id_zesp
. Jednak tabela Zespoly
nie sprawdza w żadne sposób czy w tabeli pracownicy jest
"co najmniej jeden" pracownik należący do danego zespołu.
Napisać wyzwalacz, który będzie sprawdzał, czy w tabeli
Pracownicy
istnieje chociaż jeden pracownik w
danym zespole. Jeśli nie, ma zostać zgłoszony wyjątek.
Zastanowić się czy takie rozwiązanie ma sens i jakie stwarza problemy.
Zaproponować alterantywne rozwiązanie.