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’);