Procedury składowane Kolejnym typem programu j˛ezyka PL/SQL s

Transkrypt

Procedury składowane Kolejnym typem programu j˛ezyka PL/SQL s
Procedury składowane
Kolejnym typem programu j˛ezyka PL/SQL sa˛ procedury składowane.
Procedury moga˛ posiadać parametry typu IN, OUT lub IN OUT.
Umożliwiaja˛ wykonanie operacji na danych w bazie, moga˛ też służyć
do wybierania danych.
CREATE PROCEDURE nazwa_procedury(lista
parametrów)
IS
deklaracje zmiennych
BEGIN
blok poleceń
END;
CREATE OR REPLACE PROCEDURE wypiszkraj(nr IN INT)
is
CURSOR kraje2(id INT) IS SELECT * FROM countries
WHERE region_id =id;
BEGIN
FOR kraj IN kraje2(nr) loop
Dbms_Output.put_line(kraj.country_name);
END LOOP;
END;
Procedury z poziomu SQL wywołujemy poleceniem EXECUTE.
CREATE OR REPLACE PROCEDURE wypiszkraj(nr IN INT)
is
CURSOR kraje2(id INT) IS SELECT * FROM countries
WHERE region_id =id;
BEGIN
FOR kraj IN kraje2(nr) loop
Dbms_Output.put_line(kraj.country_name);
END LOOP;
END;
Wywołanie procedury z poziomu SQL:
EXECUTE wypiszkraj(2);
Z innego podprogramu:
DECLARE nr INT;
BEGIN
nr:=1;
wypiszkraj(nr);
END;
Funkcje vs. procedury
Funkcja
musi zwracać wartość (należy
użyć RETURN);
zazwyczaj ma parametry tylko
typu IN;
można wywoływać z poziomu
zapytań SQL, np. SELECT
srednia(1,3) FROM dual;
można wywoływać w kodzie
innych podprogramów, ale
wtedy zawsze musimy ja˛
przypisać do zmiennej lub
parametru, np.
DECLARE i number;
BEGIN
i:=srednia(1,4);
END;
Procedura
może zwracać wartości;
może mieć parametry typu IN,
OUT, IN OUT;
wywołanie w SQL przez
EXECUTE;
EXECUTE
wypiszkraj(3);
można wywoływać w kodzie
innych podprogramów, np.
DECLARE nr INT;
BEGIN
nr:=1;
wypiszkraj(nr);
END;
Użycie parametrów w procedurach
Procedury moga˛ (i zazwyczaj maja)
˛ parametry. Wyróżniamy trzy typy
parametrów:
IN - parametr tylko do odczytu (read-only), służy do przekazania
danych do funkcji lub procedury; w trakcie działania procedury nie
można zmieniać wartości tego parametru; o ile nie podamy wartości
domyślnej dla danego parametru, musimy podać jego wartość
wywołujac
˛ procedur˛e;
OUT - parametr wyjściowy (write-only), umożliwia zwrócenie
danych przez program; ma wartość NULL do momentu
zainicjalizowania; nie ma możliwości przypisania DEFAULT;
wywołujac
˛ procedur˛e, nie możemy przypisać stałej tego parametru;
IN OUT - parametr wejściowo/wyjściowy (read-write); podczas
wywoływania programu służy do przekazania do niego danych,
umożliwia zwrócenie danych; używamy, gdy dane wejściowe maja˛
zostać zmienione podczas działania programu; nie ma możliwości
przypisania DEFAULT; wywołujac
˛ procedur˛e, nie możemy przypisać
stałej tego parametru.
CREATE OR REPLACE FUNCTION dodaj_kraj
(vcountry_id CHAR,
vcountry_name VARCHAR2,
vregion_id NUMBER )
RETURN BOOLEAN IS
-ustawiamy funkcj˛
e aby wykonywała si˛
e w
autonomicznej transakcji
PRAGMA autonomous_transaction;
-ustawiamy domyślny wynik
wynik BOOLEAN :=FALSE;
BEGIN
INSERT INTO countries
VALUES(vcountry_id, vcountry_name,
vregion_id);
-zatwierdzamy lokalna˛ transakcj˛
e
COMMIT;
wynik:=TRUE;
RETURN wynik;
END;
Wywoływanie procedur i funkcji w odr˛ebnej transakcji
Domyślnie, funkcje i procedury działaja˛ w obr˛ebie tej samej
transakcji, co polecenie lub program je wywołujacy.
˛
Można także ustawić funkcje i procedury tak, aby były wykonywane
w obr˛ebie autonomicznej, lokalnej transakcji. Taka transakcja może
być zatwierdzona niezależnie od transakcji programu wywołujacego.
˛
W ten sposób wszystkie zmiany wprowadzone przez
funkcj˛e/procedur˛e zostaja˛ zatwierdzone, bez wzgl˛edu na to, co
wykona si˛e w programie wywołujacym.
˛
Uwaga. działanie to jest pożadane,
˛
jeżeli chcemy aby pewne zmiany
zostały zatwierdzone, niezależnie od tego, czy coś innego si˛e
powiedzie. Może jednak doprowadzić do tego, że zatwierdzimy
zmiany, które nie powinny zostać w danej sytuacji zatwierdzone.
Aby określić, że procedura/funkcja ma być wykonywana w
autonomicznej transakcji, używamy dyrektywy
PRAGMA AUTONOMOUS_TRANSACTION.
Do zarzadzania
˛
autonomiczna˛ transakcja˛ wykorzystujemy COMMIT,
ROLLBACK i SAVEPOINT.
Wywołanie funkcji dodaj_kraj w bloku anonimowym:
BEGIN
IF dodaj_kraj(’PL’,’Polska’,1) THEN
Dbms_Output.put_line(’wiersz wstawiony’);
ROLLBACK;-bez wpływu na wstawiony wiersz!
ELSE
Dbms_Output.put_line(’wiersz nie wstawiony’);
END IF;
END;
Sekwencje
Sekwencje w bazie Oracle to mechanizmy umożliwiajace
˛
generowanie kolejnych wartości liczbowych.
Instrukcja tworzaca
˛ sekwencj˛e:
CREATE SEQUENCE nazwa
INCREMENT BY liczba
START WITH liczba
Znaczenie opcji
INCREMENT BY liczba — skok sekwencji (domyślnie 1),
START WITH liczba — wartość poczatkowa
˛
(domyślnie 1).
Metody sekwencji:
CURRVAL — pobranie bieżacej
˛ wartości,
NEXTVAL — pobranie nast˛epnej wartości.
Sekwencje
Każde wywołanie metody NEXTVAL powoduje zwi˛ekszenie
wartości sekwencji o zadany skok. Jeżeli wartość ta nie zostanie
wykorzystana, np. z powodu bł˛edu w instrukcji INSERT, wycofania
transakcji, zostaje utracona. Przy nast˛epnym wywołaniu NEXTVAL
zwraca kolejna˛ wartość.
Jedna˛ sekwencj˛e można wykorzystywać do generowania wartości
kluczy głównych w kilku tabelach.
Metoda CURRVAL nie zmienia wartości sekwencji, a jedynie zwraca
bieżac
˛ a.˛
Uwaga. Metod˛e CURRVAL można stosować dopiero po pobraniu
pierwszej wartości z sekwencji za pomoca˛ NEXTVAL.
Sekwencje
Definiujemy sekwencj˛e dla klucza głównego emp_no tabeli
employee:
CREATE SEQUENCE emp_no_seq
INCREMENT BY 1
START WITH 200
Wykorzystanie sekwencji:
INSERT INTO employee
(emp_no, first_name, last_name, salary,
dept_no, hire_date, job_code, job_grade,
job_country)
VALUES(emp_no_seq.NEXTVAL, ’Anna’,
’Kowalska’,5000,
’000’,sysdate,’Admin’,4,’USA’);

Podobne dokumenty