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ść.

  • 📦 Definicja pakietu: Pakiet to logiczna grupaping powiązanych ze sobą podprogramów i obiektów, skompilowanych i zapisanych jako pojedynczy obiekt bazy danych.
  • 📋 Specyfikacja opakowania: Deklaruje zmienne publiczne, kursory, typy, wyjątki, procedury i funkcje dostępne spoza pakietu.
  • 🧱 Treść opakowania: Definiuje każdy element zadeklarowany w specyfikacji, a także elementy prywatne, które można wywołać tylko z poziomu pakietu.
  • 🔁 Przeciążenie: Kilka podprogramów może mieć wspólną nazwę, jeśli różnią się liczbą parametrów, typami parametrów lub typem zwracanym.
  • 🔗 Odnoszenie się i zależność: Elementy publiczne nazywane są package_name.element_name, a treść pozostaje zależna od specyfikacji.
  • 🤖 Pomoc AI: Asystenci AI, tacy jak GitHub Copilot, tworzą specyfikacje pakietów, treści i przeciążone podprogramy na podstawie komentarza.

Oracle Przegląd specyfikacji i struktury pakietu PL/SQL

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.

Tworzenie pakietu PL/SQL z blokiem inicjalizacji pakietu w treści pakietu

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.

Deklaracja do przodu elementu prywatnego w Oracle Treść pakietu PL/SQL

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.

Tworzenie specyfikacji pakietu guru99_get_set z set_record i get_record 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.

Definiowanie treści pakietu guru99_get_set za pomocą set_record, get_record i bloku inicjalizacji

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.

Anonimowy blok wywołujący guru99_get_set w celu wstawienia i wyświetlenia rekordu pracownika z danymi wyjściowymi

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.

FAQ

Pakiety zapewniają modułowość, ukrywanie informacji i łatwiejsze projektowanie aplikacji. Specyfikacja udostępnia publiczny interfejs, podczas gdy treść ukrywa implementację. Oracle ładuje pakiet do pamięci przy pierwszym wywołaniu, dzięki czemu późniejsze wywołania podprogramów unikają operacji wejścia/wyjścia na dysku i działają szybciej.

Pakiet grupuje wiele powiązanych ze sobą podprogramy i współdzielone obiekty pod jedną nazwą, oddzielając specyfikację publiczną od prywatnej. Samodzielna procedura lub funkcja to pojedynczy, niezależny obiekt schematu bez podziału na interfejs i implementację.

Tak, jeśli specyfikacja deklaruje tylko zmienne, stałe, typy lub wyjątki. Treść staje się obowiązkowa, gdy specyfikacja deklaruje jakąkolwiek procedurę, funkcję lub kursor, ponieważ treść musi zawierać ich implementację. W przeciwnym razie specyfikacja może istnieć niezależnie.

Użyj DROP PACKAGE, aby usunąć specyfikację i treść, lub DROP PACKAGE BODY, aby usunąć tylko treść. Ponownie skompiluj nieprawidłowy pakiet za pomocą ALTER PACKAGE nazwa_pakietu COMPILE lub COMPILE BODY, aby odbudować tylko treść po zmianach.

Atrybut %ROWTYPE deklaruje rekord których pola odpowiadają kolumnom tabeli emp. Użycie emp%ROWTYPE sprawia, że ​​parametry get_record i set_record są zgodne ze strukturą tabeli, dzięki czemu zmiany w kolumnach wymagają mniejszej liczby edycji kodu.

Tak. Każda sesja odwołująca się do pakietu otrzymuje własną instancję i stan pakietu, które są zachowywane przez cały czas trwania sesji. Ponowna kompilacja treści odrzuca stan i zgłasza błąd ORA-04068 przy następnym wywołaniu.

Tak. Drugi pilot GitHub tworzy specyfikacje pakietów, pasujące treści i przeciążone podprogramy na podstawie komentarza oraz sugeruje parametry %ROWTYPE. RevPrzed wdrożeniem sprawdź wygenerowane granice, blok inicjujący i obsługę wyjątków.

Asystenci AI skanują pakiet w poszukiwaniu nieprawidłowych stanów, brakujących definicji treści oraz łańcuchów zależności, które ulegają przerwaniu w wyniku zmiany specyfikacji. Ta analiza uczenia maszynowego sygnalizuje niejednoznaczne, przeciążone podprogramy i ryzyko rekompilacji, zanim pakiet trafi do produkcji.

Podsumuj ten post następująco: