Oracle Pakiet PL/SQL: typ, specyfikacja, treść [Przykład]
Co zawiera pakiet Oracle?
Pakiet PL/SQL to logiczne grupowanie powiązanego podprogramu (procedury/funkcji) w pojedynczy element. Pakiet jest kompilowany i przechowywany jako obiekt bazy danych, który może być użyty później.
Składniki pakietów
Pakiet PL/SQL składa się z dwóch komponentów.
- Specyfikacja opakowania
- Treść pakietu
Specyfikacja opakowania
Specyfikacja pakietu składa się z oświadczenia ogółu społeczeństwa zmienne, kursory, obiekty, procedury, funkcje i wyjątki.
Poniżej znajduje się kilka cech specyfikacji pakietu.
- Dostęp do elementów zadeklarowanych w specyfikacji można uzyskać spoza pakietu. Takie elementy nazywane są elementami publicznymi.
- Specyfikacja pakietu jest elementem samodzielnym, co oznacza, że może istnieć samodzielnie, bez treści pakietu.
- Za każdym razem, gdy pakiet się odwołuje, dla tej konkretnej sesji tworzona jest instancja pakietu.
- Po utworzeniu instancji dla sesji wszystkie elementy pakietu zainicjowane w tej instancji obowiązują do końca sesji.
Składnia
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Powyższa składnia przedstawia tworzenie specyfikacji pakietu.
Treść pakietu
Składa się z definicji wszystkich elementów występujących w specyfikacji pakietu. Może mieć również definicję elementów, które nie są zadeklarowane w specyfikacji, elementy te nazywane są elementami prywatnymi i można je wywołać tylko z wnętrza pakietu.
Poniżej przedstawiono charakterystykę korpusu opakowania.
- Powinien zawierać definicje dla wszystkich podprogramów/kursory które zostały zadeklarowane w specyfikacji.
- Może mieć także więcej podprogramów lub innych elementów, które nie są zadeklarowane w specyfikacji. Są to tak zwane elementy prywatne.
- Jest to obiekt niezawodny i zależy od specyfikacji pakietu.
- Stan treści pakietu zmienia się na „Nieprawidłowy” za każdym razem, gdy specyfikacja jest kompilowana. Dlatego też należy go ponownie skompilować za każdym razem po kompilacji specyfikacji.
- Elementy prywatne należy najpierw zdefiniować, zanim zostaną użyte w treści pakietu.
- Pierwsza część pakietu to część deklaracji globalnej. Obejmuje to zmienne, kursory i elementy prywatne (deklaracja forward), które są widoczne dla całego pakietu.
- Ostatnią częścią pakietu jest część inicjująca pakiet, która jest wykonywana jeden raz za każdym razem, gdy pakiet jest odwoływany po raz pierwszy w sesji.
Składnia:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <global_declaration part> <Private element definition> <sub_program and public element definition> . <Package Initialization> END <package_name>
- Powyższa składnia pokazuje tworzenie treści pakietu.
Teraz zobaczymy, jak odwoływać się do elementów pakietu w programie.
Odwoływanie się do elementów pakietu
Gdy elementy zostaną zadeklarowane i zdefiniowane w pakiecie, musimy odwołać się do elementów, aby z nich korzystały.
Do wszystkich publicznych elementów pakietu można się odwoływać, wywołując nazwę pakietu, po której następuje nazwa elementu oddzielona kropką, np. „ . '.
Zmiennej publicznej pakietu można również używać w ten sam sposób do przypisywania i pobierania z nich wartości, tj. „ . '.
Utwórz pakiet w PL/SQL
W PL/SQL za każdym razem, gdy w sesji odwołuje się/wywołuje się pakiet, dla tego pakietu zostanie utworzona nowa instancja.
Oracle zapewnia możliwość inicjowania elementów pakietu lub wykonywania dowolnej czynności w momencie tworzenia tej instancji poprzez „Inicjowanie pakietu”.
To nic innego jak blok wykonawczy, który jest zapisywany w treści pakietu po zdefiniowaniu wszystkich elementów pakietu. Blok ten zostanie wykonany przy pierwszym odwołaniu pakietu w sesji.
Składnia
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- Powyższa składnia przedstawia definicję inicjalizacji pakietu w treści pakietu.
Deklaracje do przodu
Deklaracja/odwołanie do przodu w pakiecie to nic innego jak deklaracja elementów prywatnych osobno i zdefiniowanie ich w dalszej części treści pakietu.
Do elementów prywatnych można się odwoływać tylko wtedy, gdy są już zadeklarowane w treści pakietu. Z tego powodu używana jest deklaracja forward. Jest to jednak dość nietypowe w użyciu, ponieważ w większości przypadków elementy prywatne są deklarowane i definiowane w pierwszej części treści pakietu.
Deklaracja forward jest opcją udostępnianą przez Oracle, nie jest to obowiązkowe, a używanie i nieużywanie zależy od wymagań programisty.
Składnia:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element declaration> . . . <Public element definition that refer the above private element> . . <Private element definition> . BEGIN <package_initialization code>; END <package_name>
Powyższa składnia pokazuje deklarację forward. Prywatne elementy są deklarowane oddzielnie w części forward pakietu i zostały zdefiniowane w późniejszej części.
Użycie kursorów w pakiecie
W przeciwieństwie do innych elementów, należy zachować ostrożność podczas używania kursorów wewnątrz pakietu.
Jeżeli kursor jest zdefiniowany w specyfikacji pakietu lub w części globalnej treści pakietu, to po otwarciu kursor będzie się utrzymywał do końca sesji.
Dlatego należy zawsze używać atrybutów kursora „%ISOPEN”, aby sprawdzić stan kursora przed odwołaniem się do niego.
Przeciążenie
Przeciążanie to koncepcja posiadania wielu podprogramów o tej samej nazwie. Podprogramy te będą się różnić między sobą liczbą parametrów lub typami parametrów lub typem zwracanych parametrów, tzn. podprogramy o tej samej nazwie, ale z różną liczbą parametrów, innym typem parametrów lub innym ich retypem, uznawane są za przeciążające.
Jest to przydatne, gdy wiele podprogramów ma wykonać to samo zadanie, ale sposób wywoływania każdego z nich powinien być inny. W tym przypadku nazwa podprogramu pozostanie taka sama dla wszystkich, a parametry zostaną zmienione zgodnie z instrukcją wywołania.
1 przykład: W tym przykładzie utworzymy pakiet, który pobierze i ustawi wartości informacji o pracowniku w tabeli „emp”. Funkcja get_record zwróci wynik typu rekordu dla podanego numeru pracownika, a procedura set_record wstawi rekord typu rekord do tabeli emp.
Krok 1) Tworzenie specyfikacji pakietu
CREATE OR REPLACE PACKAGE guru99_get_set IS PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE); FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE; END guru99_get_set: /
Wyjście:
Package created
Objaśnienie kodu
- Linia kodu 1-5: Tworzenie specyfikacji pakietu dla guru99_get_set z jedną procedurą i jedną funkcją. Te dwa elementy są teraz publicznymi elementami tego pakietu.
Krok 2) Pakiet zawiera treść pakietu, w której zostaną zdefiniowane wszystkie procedury i funkcje. W tym kroku tworzona jest treść pakietu.
CREATE OR REPLACE PACKAGE BODY guru99_get_set IS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO emp VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager); COMMIT; END set_record; FUNCTION get_record(p_emp_no IN NUMBER) RETURN emp%ROWTYPE IS l_emp_rec emp%ROWTYPE; BEGIN SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no RETURN l_emp_rec; END get_record; BEGUN dbms_output.put_line(‘Control is now executing the package initialization part'); END guru99_get_set: /
Wyjście:
Package body created
Objaśnienie kodu
- Linia kodu 7: Tworzenie treści pakietu.
- Linia kodu 9-16: Definiowanie elementu „set_record” zadeklarowanego w specyfikacji. To samo, co zdefiniowanie samodzielnej procedury w PL/SQL.
- Linia kodu 17-24: Zdefiniowanie elementu 'get_record'. To samo, co zdefiniowanie funkcji samodzielnej.
- Linia kodu 25-26: Definiowanie części inicjującej pakiet.
Krok 3) Utworzenie anonimowego bloku do wstawiania i wyświetlania rekordów poprzez odniesienie się do utworzonego powyżej pakietu.
DECLARE l_emp_rec emp%ROWTYPE; l_get_rec emp%ROWTYPE; BEGIN dbms output.put line(‘Insert new record for employee 1004'); l_emp_rec.emp_no:=l004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary~20000; l_emp_rec.manager:=’BBB’; guru99_get_set.set_record(1_emp_rec); dbms_output.put_line(‘Record inserted'); dbms output.put line(‘Calling get function to display the inserted record'): l_get_rec:=guru99_get_set.get_record(1004); dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name); dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no); dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary'); dbms output.put line(‘Employee manager:‘||1_get_rec.manager); END: /
Wyjście:
Insert new record for employee 1004 Control is now executing the package initialization part Record inserted Calling get function to display the inserted record Employee name: CCC Employee number: 1004 Employee salary: 20000 Employee manager: BBB
Wyjaśnienie kodu:
- Linia kodu 34-37: Wypełnianie danych dla zmiennej typu rekordu w anonimowym bloku w celu wywołania elementu „set_record” pakietu.
- Linia kodu 38: Wywołano „set_record” pakietu guru99_get_set. Teraz tworzona jest instancja pakietu, która będzie obowiązywać do końca sesji.
- Część inicjująca pakiet jest wykonywana, ponieważ jest to pierwsze wywołanie pakietu.
- Rekord jest wstawiany do tabeli za pomocą elementu „set_record”.
- Linia kodu 41: Wywołanie elementu „get_record” w celu wyświetlenia szczegółów wstawionego pracownika.
- Pakiet jest odwoływany po raz drugi podczas wywołania pakietu „get_record”. Jednak tym razem część inicjująca nie jest wykonywana, ponieważ pakiet został już zainicjowany w tej sesji.
- Linia kodu 42-45: Drukowanie danych pracownika.
Zależność w pakietach
Ponieważ pakiet jest logicznym zgrupowaniem powiązanych rzeczy, ma pewne zależności. Poniżej przedstawiono zależności, którymi należy się zająć.
- Specyfikacja jest samodzielnym obiektem.
- Treść pakietu zależy od specyfikacji.
- Treść pakietu można skompilować osobno. Za każdym razem, gdy specyfikacja jest kompilowana, treść musi zostać przekompilowana, ponieważ stanie się nieważna.
- Podprogram w treści pakietu zależny od elementu prywatnego powinien być zdefiniowany dopiero po deklaracji elementu prywatnego.
- Obiekty bazy danych, do których odwołuje się specyfikacja i treść, muszą mieć prawidłowy status w momencie kompilacji pakietu.
Informacje o paczce
Po utworzeniu informacji o pakiecie, informacje o pakiecie, takie jak źródło pakietu, szczegóły podprogramu i szczegóły przeciążenia, są dostępne w Oracle tabele definicji danych.
Poniższa tabela zawiera tabelę definicji danych i informacje o pakiecie dostępne w tabeli.
Nazwa tabeli | Opis | Pytanie |
---|---|---|
ALL_OBJECT | Zawiera szczegóły pakietu, takie jak object_id, creation_date, last_ddl_time itd. Będzie zawierać obiekty utworzone przez wszystkich użytkowników. | WYBIERZ * Z wszystkich_obiektów, gdzie nazwa_obiektu =' ' |
USER_OBJECT | Podaje szczegóły pakietu, takie jak object_id, creation_date, last_ddl_time itd. Będzie zawierał obiekty utworzone przez bieżącego użytkownika. | WYBIERZ * Z obiektów_użytkownika, gdzie nazwa_obiektu =' ' |
WSZYSTKIE_ŹRÓDŁO | Podaje źródło obiektów utworzonych przez wszystkich użytkowników. | WYBIERZ * Z wszystkich_źródeł gdzie nazwa=' ' |
USER_ŹRÓDŁO | Podaje źródło obiektów utworzonych przez bieżącego użytkownika. | WYBIERZ * ZE Źródła_użytkownika, gdzie nazwa=' ' |
WSZYSTKIE_PROCEDURY | Podaje szczegóły podprogramu, takie jak object_id, szczegóły przeciążenia itp. utworzone przez wszystkich użytkowników. | WYBIERZ * Z wszystkich_procedur Gdzie nazwa_obiektu=' ' |
PROCEDURY UŻYTKOWNIKA | Podaje szczegóły podprogramu, takie jak object_id, szczegóły przeciążenia itp. utworzone przez bieżącego użytkownika. | WYBIERZ * Z procedur_użytkownika Gdzie nazwa_obiektu=' ' |
PLIK UTL – przegląd
Plik UTL to oddzielny pakiet narzędzi dostarczany przez Oracle do wykonywania zadań specjalnych. Służy głównie do odczytu i zapisu plików systemu operacyjnego z pakietów PL/SQL lub podprogramów. Posiada oddzielne funkcje do umieszczania informacji i pobierania informacji z plików. Pozwala również na odczyt/zapis w natywnym zestawie znaków.
Programista może użyć tego do zapisu plików systemu operacyjnego dowolnego typu, a plik zostanie zapisany bezpośrednio na serwerze bazy danych. Nazwa i ścieżka katalogu zostaną wymienione w momencie zapisu.
Podsumowanie
Teraz poznaliśmy pakiety w PL / SQL, a teraz powinieneś móc pracować w następujących obszarach.
- Pakiety PL/SQL i ich komponenty
- Charakterystyka opakowań
- Odwoływanie się i przeciążanie elementów pakietu
- Zarządzanie zależnościami w pakietach
- Wyświetlanie informacji o pakiecie
- Czym jest plik UTL