Oracle Balíček PL/SQL: typ, specifikace, tělo [příklad]
V čem je balíček Oracle?
Balíček PL/SQL je logické seskupení souvisejícího podprogramu (procedury/funkce) do jednoho prvku. Balíček je zkompilován a uložen jako databázový objekt, který lze později použít.
Součásti balíčků
Balíček PL/SQL má dvě složky.
- Specifikace balíčku
- Tělo balíčku
Specifikace balíčku
Specifikace balíčku se skládá z prohlášení celé veřejnosti proměnné, kurzory, objekty, procedury, funkce a výjimky.
Níže je uvedeno několik charakteristik specifikace balíčku.
- K prvkům, které jsou všechny deklarovány ve specifikaci, lze přistupovat z vnějšku balíčku. Takové prvky jsou známé jako veřejný prvek.
- Specifikace balíčku je samostatný prvek, což znamená, že může existovat samostatně bez těla balíčku.
- Kdykoli balíček odkazoval, je pro danou relaci vytvořena instance balíčku.
- Po vytvoření instance pro relaci jsou všechny prvky balíčku iniciované v této instanci platné až do konce relace.
Syntax
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Výše uvedená syntaxe ukazuje vytvoření specifikace balíčku.
Tělo balíčku
Skládá se z definice všech prvků, které jsou přítomny ve specifikaci balíčku. Může mít i definici prvků, které nejsou deklarovány ve specifikaci, tyto prvky se nazývají privátní prvky a lze je volat pouze zevnitř balíčku.
Níže jsou uvedeny charakteristiky těla balíčku.
- Měl by obsahovat definice pro všechny podprogramy/kurzory které byly deklarovány ve specifikaci.
- Může mít také více podprogramů nebo jiných prvků, které nejsou deklarovány ve specifikaci. Těm se říká privátní prvky.
- Je to spolehlivý objekt a závisí na specifikaci balíčku.
- Stav těla balíčku se stane 'Neplatným', kdykoli je specifikace zkompilována. Proto je nutné jej znovu zkompilovat pokaždé po kompilaci specifikace.
- Soukromé prvky by měly být definovány před jejich použitím v těle balíčku.
- První částí balíčku je část globální deklarace. To zahrnuje proměnné, kurzory a soukromé prvky (dopředná deklarace), které jsou viditelné pro celý balíček.
- Poslední částí balíčku je část inicializace balíčku, která se provede jednou, kdykoli je balíček v relaci odkazován poprvé.
Syntaxe:
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>
- Výše uvedená syntaxe ukazuje vytvoření těla balíčku.
Nyní se podíváme, jak odkazovat na prvky balíčku v programu.
Odkazující prvky balíčku
Jakmile jsou prvky deklarovány a definovány v balíčku, musíme prvky odkazovat, abychom je mohli používat.
Na všechny veřejné prvky balíčku lze odkazovat voláním názvu balíčku následovaného názvem prvku odděleným tečkou, tj. . '.
Veřejná proměnná balíčku může být také použita stejným způsobem k přiřazení a načtení hodnot z nich, tj. . '.
Vytvořte balíček v PL/SQL
Kdykoli je v PL/SQL v relaci odkazován/volán balíček, vytvoří se pro tento balíček nová instance.
Oracle poskytuje zařízení pro inicializaci prvků balíčku nebo provádění jakékoli činnosti v době vytvoření této instance prostřednictvím 'Inicializace balíčku'.
Toto není nic jiného než spouštěcí blok, který se zapíše do těla balíčku po definování všech prvků balíčku. Tento blok bude proveden vždy, když je balíček v relaci postoupen poprvé.
Syntax
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- Výše uvedená syntaxe ukazuje definici inicializace balíčku v těle balíčku.
Předběžná prohlášení
Dopředná deklarace/odkaz v balíčku není nic jiného, než samostatné deklarování soukromých prvků a jejich definování v pozdější části těla balíčku.
Soukromé prvky lze odkazovat pouze v případě, že jsou již deklarovány v těle balíčku. Z tohoto důvodu se používá dopředná deklarace. Použití je však poněkud neobvyklé, protože soukromé prvky jsou většinou deklarovány a definovány v první části těla balíčku.
Dopředná deklarace je možnost, kterou poskytuje Oracle, není to povinné a používání a nepoužívání je na požadavcích programátora.
Syntaxe:
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>
Výše uvedená syntaxe ukazuje dopřednou deklaraci. Soukromé prvky jsou deklarovány samostatně v přední části balíčku a byly definovány v pozdější části.
Použití kurzorů v balíčku
Na rozdíl od jiných prvků je třeba být opatrný při používání kurzorů uvnitř balíčku.
Pokud je kurzor definován ve specifikaci balíčku nebo v globální části těla balíčku, pak kurzor po otevření zůstane až do konce relace.
Takže je třeba vždy použít atributy kurzoru '%ISOPEN' k ověření stavu kurzoru před jeho odkazem.
Přetížení
Přetížení je koncept mnoha podprogramů se stejným názvem. Tyto podprogramy se od sebe budou lišit řadou parametrů nebo typů parametrů nebo návratovým typem, tj. podprogram se stejným názvem, ale s různým počtem parametrů, jiným typem parametrů nebo odlišným přetypováním jsou považovány za přetížení.
To je užitečné, když mnoho podprogramů potřebuje provést stejnou úlohu, ale způsob volání každého z nich by měl být odlišný. V tomto případě bude název podprogramu zachován pro všechny a parametry budou změněny podle volajícího příkazu.
Příklad 1: V tomto příkladu vytvoříme balíček pro získání a nastavení hodnot informací o zaměstnanci v tabulce 'emp'. Funkce get_record vrátí výstup typu záznamu pro dané číslo zaměstnance a procedura set_record vloží záznam typu záznamu do emp tabulky.
Krok 1) Vytvoření specifikace balíčku
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: /
Výstup:
Package created
Vysvětlení kódu
- Řádek kódu 1-5: Vytvoření specifikace balíčku pro guru99_get_set s jednou procedurou a jednou funkcí. Tyto dva jsou nyní veřejnými prvky tohoto balíčku.
Krok 2) Balíček obsahuje tělo balíčku, kde budou definovány všechny procedury a funkce aktuální definice. V tomto kroku se vytvoří tělo balíčku.
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: /
Výstup:
Package body created
Vysvětlení kódu
- Řádek kódu 7: Vytvoření těla balíčku.
- Řádek kódu 9-16: Definování prvku 'set_record', který je deklarován ve specifikaci. To je stejné jako definování samostatné procedury v PL/SQL.
- Řádek 17–24 kódu: Definování prvku 'get_record'. Je to stejné jako při definování samostatné funkce.
- Řádek 25–26 kódu: Definování části inicializace balíčku.
Krok 3) Vytvoření anonymního bloku pro vložení a zobrazení záznamů podle výše vytvořeného balíčku.
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: /
Výstup:
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
Vysvětlení kódu:
- Řádek 34–37 kódu: Vyplnění dat pro proměnnou typu záznamu v anonymním bloku pro volání prvku 'set_record' balíčku.
- Řádek kódu 38: Bylo provedeno volání na 'set_record' balíčku guru99_get_set. Nyní je balíček vytvořen a bude přetrvávat až do konce relace.
- Část inicializace balíčku se provede, protože se jedná o první volání balíčku.
- Záznam vložený elementem 'set_record' do tabulky.
- Řádek kódu 41: Volání prvku 'get_record' pro zobrazení podrobností o vloženém zaměstnanci.
- Na balíček je odkazováno podruhé během volání balíčku 'get_record'. Ale inicializační část se tentokrát neprovede, protože balíček je již inicializován v této relaci.
- Řádek 42–45 kódu: Tisk údajů o zaměstnanci.
Závislost v balíčcích
Vzhledem k tomu, že balíček je logickým seskupením souvisejících věcí, má určité závislosti. Následují závislosti, o které je třeba se starat.
- Specifikace je samostatný objekt.
- Tělo balíčku závisí na specifikaci.
- Tělo balíčku lze sestavit samostatně. Kdykoli je specifikace kompilována, tělo je třeba překompilovat, protože se stane neplatným.
- Podprogram v těle balíčku, který je závislý na soukromém prvku, by měl být definován až po deklaraci soukromého prvku.
- Databázové objekty, na které se odkazuje ve specifikaci a těle, musí být v době kompilace balíčku v platném stavu.
Informace o balíčku
Jakmile jsou informace o balíčku vytvořeny, informace o balíčku, jako je zdroj balíčku, podrobnosti o podprogramu a podrobnosti o přetížení, jsou dostupné v souboru Oracle tabulky definice dat.
Níže uvedená tabulka obsahuje tabulku definice dat a informace o balíčku, které jsou v tabulce k dispozici.
Název tabulky | Description | Dotaz |
---|---|---|
ALL_OBJECT | Poskytuje podrobnosti o balíčku jako object_id, creation_date, last_ddl_time atd. Bude obsahovat objekty vytvořené všemi uživateli. | SELECT * FROM all_objects where object_name =' ' |
USER_OBJECT | Poskytuje podrobnosti o balíčku jako object_id, creation_date, last_ddl_time atd. Bude obsahovat objekty vytvořené aktuálním uživatelem. | SELECT * FROM user_objects kde object_name =' ' |
ALL_SOURCE | Uvádí zdroj objektů vytvořených všemi uživateli. | SELECT * FROM all_source where name=' ' |
USER_SOURCE | Uvádí zdroj objektů vytvořených aktuálním uživatelem. | SELECT * FROM user_source where name=' ' |
VŠECHNY_PROCEDURY | Poskytuje podrobnosti o podprogramu, jako je object_id, podrobnosti o přetížení atd. vytvořené všemi uživateli. | SELECT * FROM all_procedures Where object_name=' ' |
USER_PROCEDURES | Poskytuje podrobnosti o podprogramu, jako je object_id, podrobnosti o přetížení atd. vytvořené aktuálním uživatelem. | SELECT * FROM uživatelské_procedury Where object_name=' ' |
SOUBOR UTL – Přehled
Soubor UTL je samostatný balíček nástrojů poskytovaný společností Oracle plnit speciální úkoly. To se používá hlavně pro čtení a zápis souborů operačního systému z balíčků nebo podprogramů PL/SQL. Má samostatné funkce pro vkládání informací a získávání informací ze souborů. Umožňuje také čtení/zápis v nativní znakové sadě.
Programátor to může použít k zápisu souborů operačního systému libovolného typu a soubor bude zapsán přímo na databázový server. Jméno a cesta k adresáři budou uvedeny při psaní.
Shrnutí
Nyní jsme se naučili balíčky v PL / SQLa nyní byste měli být schopni pracovat v následujícím.
- Balíčky PL/SQL a jejich komponenty
- Charakteristika obalů
- Odkazování a přetěžování prvků balíčku
- Správa závislostí v balíčcích
- Zobrazení informací o balíčku
- Co je soubor UTL