Procedury i funkcje składowane
Zmienne podstawienia i zmienne wiązane,
podprogramy, procedury składowane, typy
argumentów, wywoływanie procedur, funkcje
składowane, poziomy czystości funkcji, funkcje
tablicowe
(c) Instytut Informatyki Politechniki Poznańskiej
1
Zmienne podstawienia
Zmienne definiowane przez użytkownika mogą być użyte w miejsce
nazw relacji, atrybutów lub jako wartości atrybutów. Zmienna
podstawienia nie może być pierwszym słowem polecenia. Zmienne
podstawienia są zawsze typu CHAR.
Polecenie DEFINE bez parametrów wyświetla listę wszystkich
zmiennych podstawienia.
DEFINE myTable = 'PRACOWNICY'
DEFINE myTable = 'PRACOWNICY'
DEFINE myValue = 'PROFESOR'
DEFINE myValue = 'PROFESOR'
SELECT * FROM &myTable
SELECT * FROM &myTable
WHERE etat = '&myValue';
WHERE etat = '&myValue';
UNDEFINE myTable
UNDEFINE myTable
UNDEFINE myValue
UNDEFINE myValue
(c) Instytut Informatyki Politechniki Poznańskiej
2
Zmienne wiązane
Zmienne wiązane to zmienne deklarowane w SQL*Plus lub innym
środowisku zewnętrznym, które są dostępne w programach
PL/SQL. Mogą służyć do przekazywania wartości z PL/SQL do SQL i
do optymalizacji zapytań. W PL/SQL zachowują się jak zwykłe
zmienne.
VARIABLE x NUMBER
VARIABLE x NUMBER
BEGIN
BEGIN
SELECT COUNT(*) INTO :x FROM pracownicy;
SELECT COUNT(*) INTO :x FROM pracownicy;
END;
END;
PRINT x
PRINT x
(c) Instytut Informatyki Politechniki Poznańskiej
3
Zmienne wiązane kursorowe
Zmienne wiązane kursorowe pozwalają na odczytanie w SQL*Plus
wyniku zapytania umieszczonego w bloku PL/SQL. Mogą być
stosowane zarówno w anonimowych blokach PL/SQL, jak i jako
parametr lub typ wynikowy procedury lub funkcji.
VARIABLE x REFCURSOR
VARIABLE x REFCURSOR
BEGIN
BEGIN
OPEN :x FOR SELECT * FROM pracownicy;
OPEN :x FOR SELECT * FROM pracownicy;
END;
END;
PRINT x
PRINT x
(c) Instytut Informatyki Politechniki Poznańskiej
4
Podprogramy
Procedury (wykonują określone akcje), funkcje (wykonują
obliczenia i zwracają wartości) i pakiety (zbierają w całość logicznie
powiązane procedury, funkcje, zmienne i kursory):
" przechowywane w bazie danych w postaci skompilowanej i
zródłowej (zródło dostępne poprzez USER_SOURCE)
" postać skompilowana zwiększenie szybkości działania
" współdzielone przez wielu użytkowników
Zalety:
" rozszerzalność
" modularność
" łatwość pielęgnowania kodu
" możliwość wielokrotnego użycia kodu
" ukrycie szczegółów implementacji
(c) Instytut Informatyki Politechniki Poznańskiej
5
Definiowanie procedury
CREATE [OR REPLACE] PROCEDURE
CREATE [OR REPLACE] PROCEDURE
specyfikacja
specyfikacja
nazwa_procedury [ (argument, ...) ] IS
nazwa_procedury [ (argument, ...) ] IS
..................
deklaracje stałych, zmiennych, kursorów
..................
deklaracje stałych, zmiennych, kursorów
BEGIN
BEGIN
ciało -
..................
ciało -polecenia PL/SQL i SQL
polecenia PL/SQL i SQL
..................
END [nazwa_procedury];
END [nazwa_procedury];
" nazwa procedury musi być unikalna w ramach schematu (lub
pakietu)
" między słowami kluczowymi IS i BEGIN umieszczamy deklaracje
wszystkich zmiennych i kursorów lokalnych
" między słowami kluczowymi BEGIN i END umieszczamy kod
PL/SQL, który wykonuje dana procedura
(c) Instytut Informatyki Politechniki Poznańskiej
6
Argumenty procedur
nazwa [ IN
nazwa [ IN| OUT | IN OUT ] typ [ DEFAULT wartość ]
| OUT | IN OUT ] typ [ DEFAULT wartość ]
" w liście argumentów nie podajemy rozmiaru argumentu (tylko typ)
" argument formalny: używany w deklaracji procedury i w części
wykonywalnej PL/SQL
" argument aktualny: używany przy wywoływaniu procedury
IN OUT IN OUT
Wartość przekazywana do Wartość zwracana do Wartość przekazywana do programu
programu przez referencję środowiska przez kopiowanie i zwracana do środowiska przez
kopiowanie
W programie zachowuje się W programie zachowuje się jak W programie zachowuje się jak
jak stała nie zainicjalizowana zmienna zainicjalizowana zmienna
Musi być literałem, Musi być zmienną Musi być zmienną
wyrażeniem, stałą lub
zmienną
(c) Instytut Informatyki Politechniki Poznańskiej
7
Przykład procedury
CREATE OR REPLACE PROCEDURE
CREATE OR REPLACE PROCEDUREsprawdz_asystentow (p_id_zespIN NUMBER,
sprawdz_asystentow(p_id_zesp IN NUMBER,
p_ilu_asystentow
p_ilu_asystentowOUT NUMBER) IS
OUT NUMBER) IS
v_starszy_asystent pracownicy%ROWTYPE;
v_starszy_asystent pracownicy%ROWTYPE;
BEGIN
BEGIN
SELECT COUNT(*) INTO p_ilu_asystentow
SELECT COUNT(*) INTO p_ilu_asystentow
FROM pracownicy WHERE id_zesp
FROM pracownicy WHERE id_zesp= p_id_zesp AND etat = 'ASYSTENT';
= p_id_zespAND etat = 'ASYSTENT';
FOR
FORcur_rec IN
cur_recIN
(SELECT * FROM pracownicy WHERE id_zesp
(SELECT * FROM pracownicy WHERE id_zesp= p_id_zesp AND etat = 'ASYSTENT')
= p_id_zespAND etat = 'ASYSTENT')
LOOP
LOOP
IF (MONTHS_BETWEEN(SYSDATE,
IF (MONTHS_BETWEEN(SYSDATE,cur_rec.zatrudniony)/12) > 5 THEN
cur_rec.zatrudniony)/12) > 5 THEN
DBMS_OUTPUT.PUT_LINE('Asystent ' ||
DBMS_OUTPUT.PUT_LINE('Asystent ' ||cur_rec.nazwisko || ' pracuje ponad 5 lat');
cur_rec.nazwisko || ' pracuje ponad 5 lat');
END IF;
END IF;
END LOOP;
END LOOP;
EXCEPTION
EXCEPTION
WHEN NO_DATA_FOUND THEN
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('W zespole ' || p_id_zesp
DBMS_OUTPUT.PUT_LINE('W zespole ' || p_id_zesp|| ' nie ma asystentow');
|| ' nie maasystentow ');
END
ENDsprawdz_asystentow;
sprawdz_asystentow;
//
(c) Instytut Informatyki Politechniki Poznańskiej
8
Wywołanie procedur i funkcji (PL/SQL)
VARIABLE nr_zespolu
VARIABLE nr_zespoluNUMBER
NUMBER
VARIABLE liczba_asystentow NUMBER
VARIABLE liczba_asystentow NUMBER
BEGIN
BEGIN
:nr_zespolu
:nr_zespolu:= 20;
:= 20;
sprawdz_asystentow(:nr_zespolu,:liczba_asystentow);
sprawdz_asystentow(:nr_zespolu,:liczba_asystentow);
END;
END;
//
PRINT liczba_asystentow
PRINT liczba_asystentow
Wywołanie funkcji (SQL)
SELECT moja_funkcja(placa_pod) FROM pracownicy;
SELECT moja_funkcja(placa_pod) FROM pracownicy;
UWAGA: wołanie funkcji z poziomu SQL jest możliwe tylko wtedy
gdy funkcja posiada odpowiedni poziom czystości
(c) Instytut Informatyki Politechniki Poznańskiej
9
Czystość funkcji
Aby funkcja mogła być wywoływana z poziomu SQL, musi ona
posiadać odpowiedni poziom czystości
" funkcja wywoływana z instrukcji SELECT nie może modyfikować
żadnych wartości w bazie danych
" funkcja wywoływana z instrukcji INSERT, UPDATE, DELETE nie
może odczytywać i modyfikować żadnej tabeli, której dotyczy
instrukcja
" funkcja wywoływana z instrukcji SELECT, INSERT, UPDATE,
DELETE nie może zawierać instrukcji sterujących sesją i
transakcjami oraz instrukcji DDL
Poziom czystości deklaruje się za pomocą dyrektywy
RESTRICT_REFERENCES:
" RNDS, RNPS Reads No Database/Package State
" WNDS, WNPS Writes No Database/Package State
" TRUST brak kontroli czystości funkcji
(c) Instytut Informatyki Politechniki Poznańskiej
10
Definiowanie funkcji
CREATE [OR REPLACE] FUNCTION
CREATE [OR REPLACE] FUNCTION specyfikacja
specyfikacja
nazwa_funkcji [ (argument, ...) ]
nazwa_funkcji [ (argument, ...) ]
typ zwracany
RETURN typ IS
typ zwracany
RETURN typ IS
..................
..................
deklaracje stałych, zmiennych, kursorów
deklaracje stałych, zmiennych, kursorów
BEGIN
BEGIN
ciało -
..................
ciało -polecenia PL/SQL i SQL
polecenia PL/SQL i SQL
..................
END [nazwa_funkcji];
END [nazwa_funkcji];
" nazwa funkcji musi być unikalna w ramach schematu (lub pakietu)
" po słowie kluczowym RETURN umieszczamy typ zwracany przez funkcję
" między słowami kluczowymi IS i BEGIN umieszczamy deklaracje
wszystkich zmiennych i kursorów lokalnych
" między słowami kluczowymi BEGIN i END umieszczamy kod PL/SQL, który
wykonuje dana funkcja
" w kodzie PL/SQL musi się znalezć instrukcja RETURN
(c) Instytut Informatyki Politechniki Poznańskiej
11
Przykład funkcji
CREATE OR REPLACE FUNCTION podatek (p_id_prac IN NUMBER) RETURN
CREATE OR REPLACE FUNCTION podatek (p_id_prac IN NUMBER) RETURN
NUMBER IS
NUMBER IS
CURSOR c_pracownik IS SELECT * FROM pracownicy WHERE id_prac
CURSOR c_pracownik IS SELECT * FROM pracownicy WHERE id_prac= p_id_prac;
= p_id_prac;
v_pracownik pracownicy%ROWTYPE;
v_pracownik pracownicy%ROWTYPE;
v_roczne_zarobki NUMBER;
v_roczne_zarobki NUMBER;
v_podatek NUMBER;
v_podatek NUMBER;
BEGIN
BEGIN
OPEN c_pracownik;
OPEN c_pracownik;
FETCH c_pracownik INTO v_pracownik;
FETCH c_pracownik INTO v_pracownik;
CLOSE c_pracownik;
CLOSE c_pracownik;
v_roczne_zarobki := 12 * v_pracownik.placa_pod + NVL(v_pracownik.placa_dod, 0);
v_roczne_zarobki := 12 * v_pracownik.placa_pod + NVL(v_pracownik.placa_dod, 0);
IF (v_roczne_zarobki > 5000) THEN v_podatek := 0.40 * v_roczne_zarobki;
IF (v_roczne_zarobki > 5000) THEN v_podatek := 0.40 * v_roczne_zarobki;
ELSIF (v_roczne_zarobki > 3000) THEN v_podatek := 0.30 * v_roczne_zarobki;
ELSIF (v_roczne_zarobki > 3000) THEN v_podatek := 0.30 * v_roczne_zarobki;
ELSE v_podatek := 0.19 * v_roczne_zarobki;
ELSE v_podatek := 0.19 * v_roczne_zarobki;
END IF;
END IF;
RETURN v_podatek;
RETURN v_podatek;
END podatek;
END podatek;
(c) Instytut Informatyki Politechniki Poznańskiej
12
Funkcje tablicowe
Funkcje tablicowe dają w wyniku kolekcję krotek. Nazwy tych funkcji
mogą być wykorzystywane zamiast nazw tabel. Funkcje tablicowe
mogą również przyjmować kolekcję krotek jako parametr. Funkcje
mogą być zrównoleglone oraz potokowane, co zwiększa
efektywność przetwarzania poprzez:
" wielowątkowe wykonanie funkcji
" eliminację przechowywania wyników pośrednich
" zmniejszenie czasu odpowiedzi na pierwsze wyniki
" iteracyjne dostarczanie kolejnych krotek wyniku
W przypadku funkcji potokowanych do dostarczenia krotki do wyniku
służy komenda PIPE ROW (...)
(c) Instytut Informatyki Politechniki Poznańskiej
13
Przykład funkcji tablicowej
CREATE TYPE
CREATE TYPECharTyp AS TABLE OF VARCHAR2(20);
CharTypAS TABLE OF VARCHAR2(20);
CREATE OR REPLACE FUNCTION
CREATE OR REPLACE FUNCTIONFPracownicy(p_etat CHAR)
FPracownicy(p_etat CHAR)
RETURN
RETURNCharTyp PIPELINED AS
CharTypPIPELINED AS
BEGIN
BEGIN
FOR x IN ( SELECT * FROM pracownicy WHERE etat=p_etat) LOOP
FOR x IN ( SELECT * FROM pracownicy WHERE etat=p_etat) LOOP
PIPE ROW (x.nazwisko);
PIPE ROW (x.nazwisko);
END LOOP;
END LOOP;
RETURN;
RETURN;
END
ENDFPracownicy;
FPracownicy;
SELECT * FROM TABLE(
SELECT * FROM TABLE(FPracownicy('ASYSTENT') );
FPracownicy('ASYSTENT') );
SELECT * FROM TABLE(
SELECT * FROM TABLE(FPracownicy('PROFESOR') );
FPracownicy('PROFESOR') );
(c) Instytut Informatyki Politechniki Poznańskiej
14
Wyszukiwarka
Podobne podstrony:
17 Procedury składowane w języku PL SQL (Oracle)Procedury, funkcje, wyzwalacze programowanie w języku T SQLSQL10G pl sqlFizyka egzamin Politechnika Poznańska (PP)Oracle?tabaseg Programowanie w jezyku PL SQL or10ps6 TurboPascal Procedury i funkcje06 Procedury i funkcje cwiczenia przygotowujaceEgzam biologia politechnika poznańskaPodstawy automatyki wykład 1 Politechnika Poznańska PPWzorzec realizacji pracy dyplomowej Politechnika PoznańskaTablice Informatyczne Oracle PL SQLKinematyka Politechnika Poznańska PPOracle?tabaseg Programowanie w jezyku PL SQL or11psZbiornik Politechnika PoznańskaOracle8 Programowanie w jezyku PL SQL or8plsPodstawy automatyki wykład 4 Politechnika Poznańska PPProgramowanie warsztatowe tokarki CNC ze sterowaniem Sinumerik 840D (Politechnika Poznańska)więcej podobnych podstron