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ęcie kursora poleceniem CLOSE Zamknięty 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 FUNKCJA PAKIET PROCEDURA PAKIET FUNKCJA PROCEDURA
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, PROCEDURA TEST ps_wyj2 IN OUT NUMBER); 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 DECLARE ln_a NUMBER := 1; BEGIN add_10(pn_liczba => ln_a); dbms_output.put_line( 1+10= ln_a); END; CREATE OR REPLACE PROCEDURE add_10 (pn_liczba IN OUT NUMBER) 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ę DECLARE ln_a NUMBER := 1; ln_b NUMBER; BEGIN ln_b := add_10(ln_a); dbms_output.put_line( 1+10= ln_b); END; CREATE OR REPLACE FUNCTION add_10(pn_liczba IN NUMBER) RETURN NUMBER ; 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 PROCEDURA FUNKCJA FUNKCJA PROCEDURA FUNKCJA PROCEDURA PROCEDURA
Organizacja kodu przy użyciu pakietów ORACLE PAKIET PROCEDURA PROCEDURA PROCEDURA PROCEDURA FUNKCJA PAKIET 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 zewnętrzny Nagłówek pakietu Typ publiczny Kod zewnętrzny Zmienna globalna publiczna 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 Zmienna globalna publiczna Deklaracja procedury publicznej Deklaracja funkcji publicznej Typ prywatny Zmienna globalna prywatna Definicja procedury 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 pub1 VARCHAR2(100); CURSOR pub2 IS SELECT * FROM EMPLOYEES; PROCEDURE pub3; FUNCTION pub4 RETURN NUMBER; END; CREATE OR REPLACE PACKAGE BODY test IS pryw1 NUMBER; CURSOR pryw2 IS SELECT * FROM EMPLOYEES; PROCEDURE pryw3; PROCEDURE pub3; 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