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