
Strona o szybkim czytaniu.
Pakiety są obiektami, które służą przede wszystkim do grupowania wielu podprogramów w jedną logiczną całość. Oprócz tej funkcjonalności posiadają jeszcze wiele innych cech, które czynią je bardzo użytecznym elementem języka PL/SQL.
Pakiet składa się z dwu części: specyfikacji i ciała. Specyfikacja i ciało jednego pakietu to dla Oracle dwa różne obiekty w specyficzny sposób powiązane ze sobą.
Specyfikacja pakietu, generalnie mówiąc, zawiera wszystkie elementy, które znajdowały się w części deklaracyjnej bloku PL/SQL, a więc deklaracje podprogramów, deklaracje zmiennych, definicje typów, definicje kursorów, wyjątków.
CREATE OR REPLACE PACKAGE nazwa_pakietu
IS
-- deklaracje podprogramów
-- definicje typów
-- deklaracje zmiennych i kursorów
-- deklaracje wyjątków
END;
Elementy specyfikacji mogą występować w dowolnym porządku, przy zastrzeżeniu, że element musi być zadeklarowany wcześniej niż się do niego odwołuje inny element.
CREATE OR REPLACE PACKAGE Pkg1
IS
-- definicje typów
TYPE t_osoba IS RECORD (
imie varchar2(30),
nazwisko varchar2(30)
);
-- deklaracje zmiennych i kursorów
v_osoba1 t_osoba;
v_osoba2 t_osoba;
v_licznik number;
CURSOR c_klient IS
SELECT klt_imie, klt_nazwisko
FROM klienci;
-- deklaracje wyjątków
e_nazwisko_podwojne EXCEPTION;
-- deklaracje podprogramów
PROCEDURE zeruj_licznik;
FUNCTION get_osoba(p_numer number) RETURN t_osoba;
END;
W ciele pakietu znajdują się wszystkie elementy, które mogły występować w specyfikacji pakietu, oprócz tego wszystkie zadeklarowane w specyfikacji podprogramy muszą być zaimplementowane, przy czym nazwy wszystkich parametrów w podprogramach w ciele pakietu muszą być identyczne jak w specyfikacji.
CREATE OR REPLACE PACKAGE BODY pakiet1
IS
-- deklaracje podprogramów
-- definicje typów
-- deklaracje zmiennych i kursorów
-- deklaracje wyjątków
-- implementacja podprogramów
END;
CREATE OR REPLACE PACKAGE BODY Pkg1
IS
v_osoba3 t_osoba;
PROCEDURE zeruj_licznik
IS
BEGIN
v_licznik := 0;
END;
--
FUNCTION get_osoba(p_numer number) RETURN t_osoba
IS
BEGIN
OPEN c_klient;
FETCH c_klient INTO v_osoba3.imie, v_osoba3.nazwisko;
CLOSE c_klient;
IF v_osoba3.nazwisko = v_osoba1.nazwisko THEN
RAISE e_nazwisko_podwojne;
END IF;
RETURN v_osoba3;
END;
END;
Może istnieć pakiet zawierający tylko specyfikację bez ciała, natomiast nie może istnieć poprawne ciało bez specyfikacji pakietu.
W ramach jednego pakietu procedury i funkcje mogą zostać przeładowywane, tzn. może zostać zdefiniowanych wiele podprogramów o tej samej nazwie. Powinny się one różnić ilością i/lub typem wartości parametrów, na tej podstawie w momencie próby uruchomienia podprogramu Oracle stwierdza, który podprogram powinien zostać wykonany.
CREATE OR REPLACE PACKAGE Pkg2
IS
e_niejednoznaczna_nazwa EXCEPTION;
FUNCTION get_cena(p_id number) RETURN number;
FUNCTION get_cena(p_nazwa varchar2) RETURN number;
END;
CREATE OR REPLACE PACKAGE BODY Pkg2
IS
v_cena number;
FUNCTION get_cena(p_id number) RETURN number
IS
BEGIN
SELECT tow_cena
INTO v_cena
FROM towary
WHERE tow_id = p_id;
RETURN v_cena;
END;
FUNCTION get_cena(p_nazwa varchar2) RETURN number
IS
BEGIN
SELECT tow_cena
INTO v_cena
FROM towary
WHERE tow_nazwa = p_nazwa;
RETURN v_cena;
EXCEPTION
WHEN too_many_rows THEN
RAISE e_niejednoznaczna_nazwa;
END;
END;
Kiedy pierwszy raz zostaje użyty jakiś składnik pakietu, to tworzona jest tzw. instancja pakietu. Oznacza to, że pakiet jest wczytywany z dysku do pamięci do obszaru SGA i alokowane są zasoby na wszystkie zadeklarowane w pakiecie zmienne w obszarze PGA.
Każda sesja korzystająca z pakietu ma swoją własną kopię wszystkich zmiennych pakietowych, dzięki czemu wiele sesji może równocześnie, bezkolizyjnie korzystać z jednego pakietu.
Zmienne te przechowują swoją wartość do momentu zakończenia sesji.
W momencie, gdy tworzy się instancja pakietu, po zaalokowaniu miejsca na zmienne, ale jeszcze przed pierwszym odwołaniem, które spowodowało utworzenie instancji wykonuje się sekcja inicjująca pakietu, jeżeli została zdefiniowana.
Sekcję inicjalizującą pakietu umieszcza się na końcu ciała pakietu, poprzedzając ją słowem BEGIN.
CREATE OR REPLACE PACKAGE BODY pakiet1
IS
...
BEGIN
-- kod inicjujący pakiet
END;
CREATE OR REPLACE PACKAGE Pkg3
IS
v_partycje boolean;
...
PROCEDURE split_partition;
...
END;
CREATE OR REPLACE PACKAGE BODY Pkg3
IS
...
PROCEDURE split_partition
IS
BEGIN
...
END;
...
BEGIN
SELECT value
INTO v_partycje
FROM v$option
WHERE parameter = ‘Partitioning’;
END;
Każdy element zadeklarowany w specyfikacji pakietu jest widoczny na jego zewnątrz i można się do niego odnosić prefiksując nazwę obiektu nazwą pakietu. Dotyczy to zarówno podprogramów, zmiennych, typów, wyjątków i wszystkich pozostałych elementów.
W ten sposób elementy umieszczone w specyfikacji dowolnego pakietu stają się globalne w skali schematu, a po przydzieleniu odpowiednich uprawnień, również globalne w skali całej bazy danych.
Wewnątrz ciała pakietu wszystkie elementy zadeklarowane i zdefiniowane w specyfikacji są osiągalne bez prefiksowania ich nazwą pakietu.
Natomiast wszystkie elementy zadeklarowane w ciele pakietu, nie wyłączając podprogramów, są globalne, ale tylko dla elementów znajdujących się w ciele pakietu, a zatem nie można się będzie do nich odwoływać z innych bloków PL/SQL, w szczególności nawet ze specyfikacji tego pakietu.