Co to jest pakiet w Oracle?
Pakiet PL / SQL to logiczne zgrupowanie powiązanego podprogramu (procedury / funkcji) w jeden element. Pakiet jest kompilowany i przechowywany jako obiekt bazy danych, którego można użyć później.
W tym samouczku nauczysz się:
- Składniki pakietów
- Specyfikacja pakietu
- Treść pakietu
- Odwoływanie się do elementów pakietu
- Utwórz pakiet w PL / SQL
- Deklaracje do przodu
- Użycie kursorów w pakiecie
- Przeciążenie
- Zależność w pakietach
- Informacje o pakiecie
- PLIK UTL - przegląd
Składniki pakietów
Pakiet PL / SQL składa się z dwóch komponentów.
- Specyfikacja pakietu
- Treść pakietu
Specyfikacja pakietu
Specyfikacja pakietu składa się z deklaracji wszystkich zmiennych publicznych, kursorów, obiektów, procedur, funkcji i wyjątków.
Poniżej znajduje się kilka cech specyfikacji pakietu.
- Do elementów zadeklarowanych w specyfikacji można uzyskać dostęp spoza pakietu. Takie elementy są znane jako element publiczny.
- Specyfikacja pakietu jest samodzielnym elementem, co oznacza, że może istnieć samodzielnie, bez treści pakietu.
- Za każdym razem, gdy pakiet odwołuje się, tworzona jest instancja pakietu dla tej konkretnej sesji.
- Po utworzeniu instancji dla sesji wszystkie elementy pakietu, które są inicjowane w tej instancji, zachowują ważność do końca sesji.
Składnia
CREATE [OR REPLACE] PACKAGEIS … END
Powyższa składnia przedstawia tworzenie specyfikacji pakietu.
Treść pakietu
Składa się z definicji wszystkich elementów, które są obecne w specyfikacji pakietu. Może również zawierać 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 paczki.
- Powinien zawierać definicje wszystkich podprogramów / kursorów, które zostały zadeklarowane w specyfikacji.
- Może również mieć więcej podprogramów lub innych elementów, które nie są zadeklarowane w specyfikacji. Nazywa się to elementami prywatnymi.
- Jest to obiekt, na którym można polegać i zależy od specyfikacji pakietu.
- Stan treści pakietu zmienia się na „Nieprawidłowy” po każdej kompilacji specyfikacji. Dlatego należy go ponownie kompilować 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 przekazywania), które są widoczne dla całego pakietu.
- Ostatnią częścią pakietu jest część inicjalizacji pakietu, która jest wykonywana jednorazowo za każdym razem, gdy pakiet jest odwoływany po raz pierwszy w sesji.
Składnia:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Powyższa składnia przedstawia tworzenie treści pakietu.
Teraz zobaczymy, jak odnosić się do elementów pakietu w programie.
Odwoływanie się do elementów pakietu
Gdy elementy są zadeklarowane i zdefiniowane w pakiecie, musimy odwołać się do elementów, aby ich użyć.
Do wszystkich publicznych elementów pakietu można się odwołać, wywołując nazwę pakietu, po której następuje nazwa elementu oddzielona kropką, tj. „
Zmienna publiczna pakietu może być również używana w ten sam sposób do przypisywania i pobierania z nich wartości, np. „
Utwórz pakiet w PL / SQL
W PL / SQL za każdym razem, gdy pakiet jest odwoływany / wywoływany w sesji, zostanie utworzona nowa instancja dla tego pakietu.
Oracle zapewnia możliwość inicjowania elementów pakietu lub wykonywania jakichkolwiek czynności w czasie tworzenia tej instancji poprzez „Inicjalizację pakietu”.
To nic innego jak blok wykonania, który jest zapisywany w treści pakietu po zdefiniowaniu wszystkich elementów pakietu. Ten blok zostanie wykonany za każdym razem, gdy pakiet zostanie odwołany po raz pierwszy w sesji.
Składnia
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Powyższa składnia przedstawia definicję inicjalizacji pakietu w treści pakietu.
Deklaracje do przodu
Przekaż deklarację / odwołanie w pakiecie to nic innego jak oddzielne zadeklarowanie elementów prywatnych i zdefiniowanie ich w dalszej części treści pakietu.
Do elementów prywatnych można odwoływać się tylko wtedy, gdy są już zadeklarowane w treści pakietu. Z tego powodu stosuje się deklarację forward. Jednak jest to raczej 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ą oferowaną przez Oracle, nie jest obowiązkowa, a używanie i niewykorzystywanie zależy od wymagań programisty.
Składnia:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Powyższa składnia przedstawia deklarację do przodu. Elementy prywatne są deklarowane osobno w pierwszej części pakietu i zostały zdefiniowane w dalszej części.
Użycie kursorów w pakiecie
W przeciwieństwie do innych Elementów należy zachować ostrożność używając kursorów wewnątrz opakowania.
Jeśli kursor jest zdefiniowany w specyfikacji pakietu lub w globalnej części treści pakietu, to raz otwarty kursor będzie trwał do końca sesji.
Dlatego należy zawsze używać atrybutów kursora „% ISOPEN”, aby zweryfikować 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ć od siebie wieloma parametrami lub typami parametrów lub typem zwracania, tj. Podprogram o tej samej nazwie, ale z różną liczbą parametrów, różnymi typami parametrów lub różnymi typami są uznawane za przeciążenie.
Jest to przydatne, gdy wiele podprogramów musi wykonać to samo zadanie, ale sposób wywoływania każdego z nich powinien być inny. W tym przypadku nazwa podprogramu będzie taka sama dla wszystkich, a parametry zostaną zmienione zgodnie z instrukcją wywołującą.
Przykład 1 : 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 rekordu do tabeli emp.
Krok 1) Tworzenie specyfikacji pakietu
CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;END guru99_get_set:/
Wynik:
Package created
Objaśnienie kodu
- Linia kodu 1-5 : Tworzenie specyfikacji pakietu dla guru99_get_set z jedną procedurą i jedną funkcją. Te dwa są teraz publicznymi elementami tego pakietu.
Krok 2) Pakiet zawiera treść pakietu, w której zostaną zdefiniowane wszystkie procedury i funkcje. Na tym etapie tworzona jest treść pakietu.
CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN l_emp_rec;END get_record;BEGUN dbms_output.put_line(‘Control is now executing the package initialization part');END guru99_get_set:/
Wynik:
Package body created
Objaśnienie kodu
- Linia kodu 7 : Tworzenie treści pakietu.
- Linia kodu 9-16 : Definiowanie elementu „set_record”, który jest zadeklarowany w specyfikacji. To jest to samo, co definiowanie samodzielnej procedury w PL / SQL.
- Linia kodu 17-24: Definiowanie elementu „get_record”. To jest to samo, co definiowanie samodzielnej funkcji.
- Linia kodu 25-26: Definiowanie części inicjującej pakiet.
Krok 3) Utworzenie anonimowego bloku do wstawiania i wyświetlania rekordów, odwołując się do powyższego utworzonego pakietu.
DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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:/
Wynik:
Insert new record for employee 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB
Objaś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 pakiet jest tworzony i będzie istniał do końca sesji.
- Część inicjująca pakiet jest wykonywana, ponieważ jest to pierwsze wywołanie pakietu.
- Rekord jest wstawiany przez element „set_record” do tabeli.
- Linia kodu 41: Wywołanie elementu „get_record” w celu wyświetlenia szczegółów wstawionego pracownika.
- Pakiet jest odsyłany po raz drugi podczas wywołania pakietu „get_record”. Ale część inicjalizacyjna nie jest tym razem wykonywana, ponieważ pakiet jest 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ść, którą należy się zająć.
- Specyfikacja to samodzielny obiekt.
- Treść pakietu zależy od specyfikacji.
- Treść pakietu można skompilować osobno. Za każdym razem, gdy kompilowana jest specyfikacja, treść 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 zadeklarowaniu elementu prywatnego.
- Obiekty bazy danych, do których odwołuje się specyfikacja i treść, muszą mieć prawidłowy stan w momencie kompilacji pakietu.
Informacje o pakiecie
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 tabelach definicji danych Oracle.
Poniższa tabela zawiera tabelę definicji danych i informacje o pakiecie, które są dostępne w tabeli.
Nazwa tabeli | Opis | Pytanie |
ALL_OBJECT | Podaje szczegóły pakietu, takie jak object_id, create_date, last_ddl_time, itp. Będzie zawierał obiekty utworzone przez wszystkich użytkowników. | SELECT * FROM all_objects, gdzie object_name = '
|
USER_OBJECT | Podaje szczegóły pakietu, takie jak object_id, create_date, last_ddl_time, itp. Będzie zawierać obiekty utworzone przez bieżącego użytkownika. | SELECT * FROM user_objects gdzie object_name = '
|
ALL_SOURCE | Podaje źródło obiektów tworzonych przez wszystkich użytkowników. | SELECT * FROM all_source where name = '
|
USER_SOURCE | Podaje źródło obiektów utworzonych przez bieżącego użytkownika. | SELECT * FROM user_source, gdzie nazwa = ' |
ALL_PROCEDURES | Podaje szczegóły podprogramu, takie jak identyfikator_obiektu, szczegóły przeciążenia itp. Utworzone przez wszystkich użytkowników. | SELECT * FROM all_procedures Where object_name = '
|
USER_PROCEDURES | Podaje szczegóły podprogramu, takie jak identyfikator_obiektu, szczegóły przeciążenia itp. Utworzone przez bieżącego użytkownika. | SELECT * FROM user_procedures gdzie object_name = '
|
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 lub podprogramów PL / SQL. Posiada oddzielne funkcje do umieszczania informacji i pobierania informacji z plików. Umożliwia również odczyt / zapis w natywnym zestawie znaków.
Programista może użyć tego do zapisania plików systemu operacyjnego dowolnego typu, a plik zostanie zapisany bezpośrednio na serwerze bazy danych. Nazwa i ścieżka katalogu zostaną wymienione podczas pisania.
Podsumowanie
Nauczyliśmy się teraz pakietów w PL / SQL i powinieneś być w stanie pracować nad następującymi elementami.
- Pakiety PL / SQL i ich komponenty
- Charakterystyka opakowań
- Odwoływanie się i przeciążanie elementów pakietu
- Zarządzanie zależnościami w pakietach
- Przeglądanie informacji o pakiecie
- Co to jest plik UTL