Oracle Pakiet PL/SQL: typ, specyfikacja, treść [Przykład]
⚡ Inteligentne podsumowanie
Pakiety PL/SQL grupują powiązane procedury, funkcje, zmienne, kursory i wyjątki w jednym obiekcie schematu ze specyfikacją i treścią. Specyfikacja deklaruje interfejs publiczny, a treść zawiera implementację prywatną, co poprawia modułowość i wydajność.
Co zawiera pakiet Oracle?
Oracle PL / SQL pakiet jest logiczną grupąping powiązanych podprogramy (procedurę/funkcję) w pojedynczy element. Pakiet jest kompilowany i przechowywany jako obiekt bazy danych, który można później ponownie wykorzystać.
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 deklaracji wszystkich danych publicznych zmienne, kursory, obiekty, procedury, funkcje i wyjątki.
Poniżej przedstawiono kilka cech specyfikacji pakietu.
- Dostęp do elementów zadeklarowanych w specyfikacji jest możliwy spoza pakietu. Takie elementy nazywane są elementami publicznymi.
- Specyfikacja pakietu jest samodzielnym elementem, co oznacza, że może istnieć samodzielnie, bez treści pakietu.
- Za każdym razem, gdy odwołujemy się do pakietu, tworzona jest instancja pakietu dla danej sesji.
- 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 ilustruje tworzenie specyfikacji pakietu.
Treść pakietu
Treść pakietu składa się z definicji wszystkich elementów zawartych w specyfikacji pakietu. Może również zawierać definicje elementów niezadeklarowanych w specyfikacji; elementy te nazywane są elementami prywatnymi i można je wywołać tylko z wnętrza pakietu.
Poniżej przedstawiono charakterystykę treści pakietu.
- Powinien zawierać definicje wszystkich podprogramów/kursorów zadeklarowanych w specyfikacji.
- Może również zawierać więcej podprogramów lub innych elementów, które nie są zadeklarowane w specyfikacji. Nazywa się je elementami prywatnymi.
- Jest to obiekt zależny i zależy od specyfikacji pakietu.
- Stan treści pakietu zmienia się na „Nieprawidłowy” za każdym razem, gdy specyfikacja jest kompilowana. W związku z tym konieczne jest ponowne skompilowanie po każdej kompilacji specyfikacji.
- Elementy prywatne należy najpierw zdefiniować, zanim zostaną użyte w treści pakietu.
- Pierwszą częścią ciała pakietu jest deklaracja globalna. Obejmuje ona 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 jednokrotnie za każdym razem, gdy w sesji odwołujemy się do pakietu po raz pierwszy.
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 ilustruje tworzenie treści pakietu.
Teraz pokażemy, jak odwoływać się do elementów pakietu w programie.
Odwoływanie się do elementów pakietu
Po zadeklarowaniu i zdefiniowaniu elementów w pakiecie musimy odwołać się do tych elementów, aby ich użyć.
Do wszystkich publicznych elementów pakietu można odwołać się, wywołując nazwę pakietu, po której następuje nazwa elementu oddzielona kropką, np. . '.
Zmienne publiczne pakietu można również wykorzystać 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łujemy się do pakietu lub go wywołujemy, tworzona jest nowa instancja tego pakietu.
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 zapisywany w treści pakietu po zdefiniowaniu wszystkich jego elementów. Ten blok będzie wykonywany za każdym razem, gdy w sesji odwołujemy się do pakietu po raz pierwszy.
Poniższy zrzut ekranu pokazuje, w jaki sposób blok inicjalizacji pakietu jest umieszczany w treści pakietu podczas jego tworzenia.
Składnia
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGIN <Package Initialization> END <package_name>
Powyższa składnia przedstawia definicję inicjalizacji pakietu w treści pakietu.
Deklaracje do przodu
Deklaracja lub 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 zostały już zadeklarowane w treści pakietu. Z tego powodu stosuje się deklarację wyprzedzającą. Jest to jednak raczej nietypowe, ponieważ najczęściej 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 jego użycie lub nie zależy od wymagań programisty.
Poniższy zrzut ekranu pokazuje, w jaki sposób element prywatny jest deklarowany dalej i później definiowany w treści pakietu.
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 globalnej części treści pakietu, to kursor po otwarciu będzie obecny do końca sesji.
Dlatego zawsze należy używać atrybutu kursora '%ISOPEN' w celu sprawdzenia stanu kursora przed odwołaniem się do niego.
Przeciążenie
Przeciążanie to koncepcja posiadania wielu podprogramów o tej samej nazwie. Podprogramy te różnią się między sobą liczbą parametrów, ich typami lub typem zwracanym. Innymi słowy, podprogramy o tej samej nazwie, ale z inną liczbą parametrów, różnymi typami parametrów lub innym typem zwracanym, są uważane za przeciążające.
Jest to przydatne, gdy wiele podprogramów musi wykonać to samo zadanie, ale sposób wywołania każdego z nich powinien być inny. W takim przypadku nazwa podprogramu pozostaje taka sama dla wszystkich, a parametry są zmieniane zgodnie z instrukcją wywołania.
1 przykład: W tym przykładzie utworzymy pakiet do pobierania i ustawiania 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
Poniższy zrzut ekranu przedstawia specyfikację pakietu guru99_get_set, która jest tworzona w Oracle.
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
Code Wyjaśnienie
- Code wiersz 1-5: Tworzenie specyfikacji pakietu dla guru99_get_set z jedną procedurą i jedną funkcją. Te dwa elementy są teraz elementami publicznymi tego pakietu.
Krok 2) Pakiet zawiera treść pakietu, w której zdefiniowane są rzeczywiste definicje wszystkich procedur i funkcji. Na tym etapie tworzona jest treść pakietu.
Poniższy zrzut ekranu przedstawia definicję treści pakietu guru99_get_set w Oracle.
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; BEGIN dbms_output.put_line('Control is now executing the package initialization part'); END guru99_get_set; /
Wyjście:
Package body created
Code Wyjaśnienie
- Code linia 7: Tworzenie treści pakietu.
- Code wiersz 9-16: Zdefiniowanie elementu „set_record” zadeklarowanego w specyfikacji. Jest to to samo, co zdefiniowanie samodzielnej procedury w PL/SQL.
- Code wiersz 17-24: Definiowanie elementu „get_record”. To to samo, co definiowanie samodzielnej funkcji.
- Code wiersz 25-26: Definiowanie części inicjującej pakiet.
Krok 3) Utworzenie anonimowego bloku w celu wstawiania i wyświetlania rekordów poprzez odwołanie się do pakietu utworzonego powyżej.
Poniższy zrzut ekranu pokazuje anonimowy blok wywołujący pakiet wraz z jego danymi wyjściowymi Oracle.
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:=1004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary:=20000; l_emp_rec.manager:='BBB'; guru99_get_set.set_record(l_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:'||l_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
Code Wyjaśnienie:
- Code wiersz 34-37: Wypełnianie danych dla zmiennej typu rekordu w anonimowym bloku w celu wywołania elementu „set_record” pakietu.
- Code linia 38: Wywołano funkcję „set_record” pakietu guru99_get_set. Pakiet został utworzony i będzie istniał do końca sesji. Część inicjująca pakiet jest wykonywana, ponieważ jest to pierwsze wywołanie pakietu, a rekord jest wstawiany do tabeli przez element „set_record”.
- Code linia 41: Wywołanie elementu „get_record” w celu wyświetlenia szczegółów wstawionego pracownika. Podczas tego wywołania odwołujemy się do pakietu po raz drugi, ale część inicjująca nie jest wykonywana ponownie, ponieważ pakiet jest już zainicjowany w tej sesji.
- Code wiersz 42-45: Drukowanie danych pracownika.
Zależność w pakietach
Ponieważ pakiet jest logiczną grupąping W przypadku powiązanych rzeczy istnieją 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ść pakietu musi zostać ponownie skompilowana, ponieważ stanie się niepoprawna.
- Podprogram w treści pakietu, który jest zależny od elementu prywatnego, powinien zostać 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 pakietu informacje o pakiecie, takie jak źródło pakietu, szczegóły podprogramu i szczegóły przeciążenia, są dostępne w Oracle tabele słownika danych.
Poniższa tabela zawiera tabelę słownika danych i informacje o pakietach dostępne w każdej tabeli.
| Nazwa tabeli | OPIS | Pytanie |
|---|---|---|
| WSZYSTKIE_OBIEKTY | Zawiera szczegóły pakietu, takie jak object_id, creation_date, last_ddl_time itd. Zawiera obiekty utworzone przez wszystkich użytkowników. | WYBIERZ * Z wszystkich_obiektów, gdzie nazwa_obiektu =' ' |
| OBIEKTY_UŻYTKOWNIKA | Zawiera szczegóły pakietu, takie jak object_id, creation_date, last_ddl_time itd. 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 all_procedures Gdzie object_name=' ' |
| PROCEDURY UŻYTKOWNIKA | Podaje szczegóły podprogramu, takie jak object_id, szczegóły przeciążenia itp. utworzone przez bieżącego użytkownika. | WYBIERZ * Z user_procedures Gdzie object_name=' ' |
UTL_FILE – Przegląd
UTL_FILE to osobny pakiet narzędziowy 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 i pobierania informacji z plików. Umożliwia również odczyt i zapis w natywnym zestawie znaków.
Programista może używać tego do zapisywania plików systemu operacyjnego dowolnego typu, a plik zostanie zapisany bezpośrednio na serwerze bazy danych. Nazwa i ścieżka do katalogu są podane w momencie pisania.






