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

Utwórz pakiet w PL/SQL

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.

Deklaracje do przodu

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

Przeciążenie

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.

Przeciążenie

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.

Przeciążenie

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