nagłówek pakietu

Transkrypt

nagłówek pakietu
PL/SQL
Zaawansowane tematy PL/SQL
Cele
• Przypomnienie kursorów
• Przypomnienie procedur i funkcji
składowanych
• Poznanie pakietów składowanych
2
Bazę danych Oracle możemy traktować
jakby była złożona z dwóch
powiązanych ze sobą części
Interpreter PL/SQL
SQL
(System
Zarządzania bazą
danych, RDBMS)
Kursor służy do pobierania danych z
bazy danych do kodu PL/SQL
KURSOR
Interpreter PL/SQL
DANE
SQL
(System
Zarządzania bazą
danych, RDBMS)
Cykl życia kursorów
Otwarcie kursora
poleceniem OPEN
Zamknięty
Zamknięcie kursora
poleceniem CLOSE
Otwarty
Zamknięty
Pobieranie danych poleceniem FETCH
Kursory
• Deklaracja kursora (w sekcji deklaracji)
– CURSOR nazwa_kursora IS zapytanie_select;
• Otwarcie kursora
– OPEN nazwa_kursora
• Pobranie danych
– FETCH nazwa_kursora INTO zmienne;
• Zamknięcie kursora
– CLOSE nazwa_kursora;
6
Blok PL/SQL - przypomnienie
• Przypomnienie anonimowego bloku PL/SQL
DECLARE
deklaracja zmiennych
BEGIN
instrukcje PL/SQL
EXCEPTION
obsługa wyjątków
END;
• nie ma nazwy
• nie jest
przechowywany w
bazie danych
7
Kod składowany - przypomnienie
• Zestaw instrukcji realizujący pewną
funkcjonalność
• Przechowywany w bazie danych jako obiekt
bazodanowy
• Posiada nazwę
• Tworzony za pomocą instrukcji CREATE OR
REPLACE
8
Porównanie anonimowego bloku
PL/SQL i procedury składowanej
PL/SQL
DECLARE
deklaracja zmiennych
BEGIN
instrukcje PL/SQL
EXCEPTION
obsługa wyjątków
END;
CREATE OR REPLACE
PROCEDURE nazwa IS
deklaracja zmiennych
BEGIN
instrukcje PL/SQL
EXCEPTION
obsługa wyjątków
END;
9
Kod składowany
ORACLE
PROCEDURA
PROCEDURA
FUNKCJA
FUNKCJA
PAKIET
PROCEDURA
PAKIET
Kod składowany
• W języku PL/SQL wyróżniamy następujące
typy kodu składowanego:
– procedury
– funkcje
– pakiety
– wyzwalacze
11
Procedura - przypomnienie
• Zestaw instrukcji realizujący pewną
funkcjonalność.
• Może przyjmować dowolną ilość parametrów
wejściowych i zwracać dowolną ilość
parametrów wyjściowych.
• Przykładem procedury jest procedura
DBMS_OUTPUT.PUT_LINE(tekst)
Procedura
WYŚLIJ(ADRES, TREŚĆ);
PARAMETRY
ADRES
TREŚĆ
PROCEDURA WYŚLIJ( … , … )
Procedura - przypomnienie
• Budowa procedury
CREATE OR REPLACE PROCEDURE nazwa_procedury
(parametr1 IN/OUT typ,
parametr2 IN/OUT typ, …)
IS
deklaracja zmiennych
BEGIN
instrukcje PL/SQL
EXCEPTION
obsługa wyjątków
END;
14
Przykład listy parametrów
CREATE OR REPLACE PROCEDURE test_parametrow
(
pn_parametr1 IN NUMBER,
ps_parametr2 OUT VARCHAR2,
pd_parametr3 IN OUT DATE,
pn_parametr4 OUT NUMBER,
pn_parametr5 IN VARCHAR2
)
15
Lista parametrów
• Parametry wejściowe umożliwiają wprowadzanie
danych do procedury
PROCEDURE test (ps_wej1 IN VARCHAR2,
ps_wej2 IN NUMBER);
PROCEDURA TEST
Dane do przetworzenia
test(‘alfa’,5)
Przykład demonstrujący parametr
wejściowy
W procedurze z parametru wejściowego możemy tylko
odczytywać dane, nie możemy do parametru
wejściowego danych zapisywać.
CREATE OR REPLACE PROCEDURE
wyswietl(ps_t IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.put_line(ps_t);
END;
17
Przykład demonstrujący parametr
wejściowy
CREATE OR REPLACE
PROCEDURE wyswietl
(ps_t IN VARCHAR2)
…
BEGIN
wyswietl(ps_t => ‘Hello world!’);
END;
18
Lista parametrów
Parametry wyjściowe umożliwiają zapisanie wyników
pracy procedury do zmiennych w kodzie zewnętrznym
PROCEDURE test (ps_wyj1 OUT VARCHAR2,
ps_wyj2 OUT NUMBER);
PROCEDURA TEST
Wyniki procedury test
test(ls_a, ln_b)
Przykład demonstrujący parametr
wyjściowy
W procedurze do parametru wyjściowego możemy
tylko zapisywać, nie możemy danych odczytywać. Dane
zostają zapisane w zmiennych w kodzie zewnętrznym.
CREATE OR REPLACE PROCEDURE
format_sysdate(ps_f OUT VARCHAR2) IS
BEGIN
ps_f := TO_CHAR(SYSDATE, ‘YYYY-MONTH-DD’);
END;
20
Przykład demonstrujący parametr
wyjściowy
CREATE OR REPLACE
PROCEDURE format_sysdate
(ps_f OUT VARCHAR2)
…
DECLARE
ls_formatted_date VARCHAR2(50);
BEGIN
format_sysdate (ps_f => ls_formatted_date);
dbms_output.put_line (‘Dzis jest ‘ || ls_formatted_date);
END;
21
Lista parametrów
Parametry wejściowo-wyjściowe umożliwiają
modyfikowanie wartości zmiennych w kodzie zewnętrznym
PROCEDURE test (ps_wyj1 IN OUT VARCHAR2,
ps_wyj2 IN OUT NUMBER);
PROCEDURA TEST
test(ls_a, ln_b)
Przykład demonstrujący parametr
wejściowo-wyjściowy
W procedurze parametr wejściowo-wyjściowy możemy
odczytywać oraz możemy do niego zapisywać. W ten
sposób modyfikujemy zmienne w kodzie zewnętrznym
przypisane do tego parametru.
CREATE OR REPLACE PROCEDURE add_10(pn_liczba IN OUT
NUMBER) IS
BEGIN
pn_liczba := pn_liczba+10;
END;
23
Przykład demonstrujący parametr
wejściowo-wyjściowy
CREATE OR REPLACE
PROCEDURE add_10
(pn_liczba IN OUT NUMBER)
…
DECLARE
ln_a NUMBER := 1;
BEGIN
add_10(pn_liczba => ln_a);
dbms_output.put_line(‘1+10=‘ || ln_a);
END;
24
Funkcja - przypomnienie
• Zestaw instrukcji realizujący pewną
funkcjonalność i zwracający pewną wartość
• Może przyjmować dowolną ilość parametrów
wejściowych i zwracać dowolną ilość
parametrów wyjściowych.
• Przykładem funkcji jest funkcja
TO_NUMBER(tekst, format)
Funkcja
C := DODAJ (A, B);
PARAMETRY
A
B
WYNIK
C
FUNKCJA DODAJ( … , … )
Przykład demonstrujący funkcję
Funkcja musi zwracać wartość. Typ wartości zwracanej
przez funkcję definiujemy za pomocą wyrażenia
RETURN typ_wyniku. Wartości zwracamy za pomocą
instrukcji RETURN <wartość>.
CREATE OR REPLACE FUNCTION add_10(pn_liczba IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN pn_liczba+10;
END;
27
Przykład demonstrujący funkcję
CREATE OR REPLACE FUNCTION
add_10(pn_liczba IN NUMBER)
RETURN NUMBER ;
…
DECLARE
ln_a NUMBER := 1;
ln_b NUMBER;
BEGIN
ln_b := add_10(ln_a);
dbms_output.put_line(‘1+10=‘ || ln_b);
END;
28
Kod składowany - przypomnienie
• Może być wykorzystywany przez inne
programy
• Umożliwia dekompozycję programu na
mniejsze części
• Ułatwia projektowanie i naprawianie błędów
• Ułatwia ponowne użycie kodu w innych
systemach
29
Organizacja kodu bez użycia pakietów
ORACLE
PROCEDURA
FUNKCJA
PROCEDURA
PROCEDURA
PROCEDURA
FUNKCJA
FUNKCJA
PROCEDURA
Organizacja kodu przy użyciu pakietów
ORACLE
PAKIET
PAKIET
PROCEDURA
PROCEDURA
PROCEDURA
PROCEDURA
FUNKCJA
PROCEDURA
FUNKCJA
FUNKCJA
Organizacja kodu
BEZ UŻYCIA PAKIETÓW
AKTUALIZUJ_LICZNIK_
KILOMETROW
DAJ_PREMIE_
PRACOWNIKOWI
DODAJ_SAMOCHOD
USUŃ_SAMOCHOD
ZATRUDNIJ_PRACOWNIKA
ZWOLNIJ_PRACOWNIKA
PRZY UŻYCIU PAKIETÓW
Pakiet PRACOWNIK:
DAJ_PREMIE
ZATRUDNIJ
ZWOLNIJ
Pakiet SAMOCHOD:
AKTUALIZUJ_
LICZNIK_KILOMETROW
DODAJ
USUŃ
Budowa pakietu
Pakiet składa się z dwóch części – z nagłówka i z ciała
NAGŁÓWEK PAKIETU
(PACKAGE)
CIAŁO PAKIETU
(PACKAGE BODY)
Nagłówek pakietu
• Nagłówek pakietu zawiera deklaracje typów,
zmiennych, kursorów, procedur, funkcji
• Obiekty zadeklarowane w nagłówku pakietu
są publiczne
• Kod zewnętrzny może odwoływać się do
obiektów zadeklarowanych w nagłówku
pakietu
– Przez kod zewnętrzny rozumiemy procedury,
funkcje, inne pakiety, wyzwalacze, bloki
anonimowe
34
Nagłówek pakietu
Do nagłówka pakietu może odwoływać się kod
Nagłówek pakietu
zewnętrzny
Typ publiczny
Zmienna globalna publiczna
Kod
zewnętrzny
Deklaracja procedury
publicznej
Deklaracja funkcji
publicznej
35
Nagłówek pakietu
• Konstrukcja nagłówka pakietu
CREATE OR REPLACE PACKAGE nazwa_pakietu
IS
deklaracje typów;
deklaracje zmiennych;
deklaracje kursorów;
deklaracje procedur i funkcji;
END;
36
Nagłówek pakietu
• W nagłówku deklarujemy procedury i funkcje
publiczne. Deklaracja procedury lub funkcji to
tylko nagłówek procedury lub funkcji,
deklaracja nie zawiera instrukcji. Kod tych
procedur i funkcji znajduje się w ciele pakietu.
– Deklaracja procedury i funkcji:
PROCEDURE wyswietl(tekst IN VARCHAR2);
FUNCTION dodaj_10 (a IN NUMBER)
RETURN NUMBER;
37
Nagłówek pakietu
• Przykład nagłówka pakietu. Nagłówek pakietu
nie zawiera kodu PL/SQL.
CREATE OR REPLACE PACKAGE nazwa_pakietu IS
gs_tekst VARCHAR2(2000);
PROCEDURE nazwa_procedury (parametry);
FUNCTION nazwa_funkcji (parametry)
RETURN typ_danych_zwracanych;
END;
38
Ciało pakietu
• Nazwa ciała pakietu musi być identyczna z
nazwą nagłówka pakietu
• Jest nieobowiązkowy w pakiecie
• Odpowiada za implementację logiki pakietu–
zawiera kod PL/SQL
• Kod zewnętrzny może uruchamiać tylko te
procedury i funkcje, które są zadeklarowane w
specyfikacji pakietu
39
Pakiet
Nagłówek pakietu obiekty publiczne
Ciało pakietu
definicje, kod PL/SQL
Typ publiczny
Typ prywatny
Zmienna globalna publiczna
Zmienna globalna prywatna
Deklaracja procedury
publicznej
Definicja procedury publicznej
Deklaracja funkcji
publicznej
Definicja funkcji publicznej
Definicja procedury prywatnej
40
Ciało pakietu
• Musi zawierać implementację wszystkich
zadeklarowanych w nagłówku procedur i
funkcji. Wszystkie parametry funkcji i procedur
zadeklarowanych w nagłówku muszą się
zgadzać z parametrami funkcji i procedur
zdefiniowanych w ciele pakietu
41
Ciało pakietu
• Może zawierać dodatkowe obiekty (typów,
zmiennych, kursorów, procedur, funkcji), ale
będą to obiekty prywatne, niedostępne z
zewnątrz pakietu
• Do obiektów prywatnych odwoływać mogą się
inne obiekty wewnątrz ciała pakietu
42
Ciało pakietu
• Przykład konstrukcji ciała pakietu
CREATE OR REPLACE PACKAGE BODY nazwa_pakietu
IS
zmienna_prywatna NUMBER;
PROCEDURE nazwa_procedury (parametry) IS
…
BEGIN
…
END;
ciąg dalszy ->
43
Ciało pakietu
• Przykład konstrukcji ciała pakietu
FUNCTION nazwa_funkcji (parametry)
RETURN typ_danych_zwracanych IS
…
BEGIN
…
END;
END;
44
Pakiet bazodanowy
CREATE OR REPLACE
PACKAGE test IS
CREATE OR REPLACE
PACKAGE BODY test IS
pub1 VARCHAR2(100);
pryw1 NUMBER;
CURSOR pub2 IS
SELECT * FROM EMPLOYEES;
CURSOR pryw2 IS
SELECT * FROM EMPLOYEES;
PROCEDURE pub3;
PROCEDURE pryw3;
FUNCTION pub4 RETURN
NUMBER;
PROCEDURE pub3;
END;
FUNCTION pub4 RETURN
NUMBER;
END;
Korzystanie z pakietów
• Uruchamianie procedury z pakietu
BEGIN
nazwa_pakietu.nazwa_procedury(parametry);
END;
• Korzystanie ze zmiennej globalnej publicznej
BEGIN
nazwa_pakietu.nazwa_zmiennej := 5;
END;
46
Korzystanie z pakietów
• Uruchamianie funkcji z pakietu w zapytaniu SQL
SELECT nazwa_pakietu.nazwa_funkcji(parametry)
FROM employees
WHERE …
• Korzystanie z typu zdefiniowanego w pakiecie
DECLARE
zmienna nazwa_pakietu.nazwa_typu
...
BEGIN
47
Korzystanie z pakietów
• Uruchamianie procedury w innej procedurze
PROCEDURE test IS
BEGIN
nazwa_pakietu.nazwa_procedury(parametry);…
• Uruchamianie procedury w innej procedurze tego
samego pakietu nie wymaga podania nazwy pakietu
PROCEDURE proc_w_tym_samym_pakiecie
BEGIN
nazwa_procedury(parametry);…
48
Usuwanie kodu składowanego
• Kod składowany usuwamy za pomocą
poleceń:
DROP PROCEDURE nazwa_procedury;
DROP FUNCTION nazwa_funkcji;
DROP PACKAGE nazwa pakietu;
DROP PACKAGE BODY nazwa pakietu;
49

Podobne dokumenty