Co je balíček v Oracle?
Balíček PL / SQL je logické seskupení souvisejícího podprogramu (procedury / funkce) do jednoho prvku. Balíček je kompilován a uložen jako databázový objekt, který lze použít později.
V tomto výukovém programu se naučíte
- Součásti balíčků
- Specifikace balíčku
- Tělo balení
- Odkazující prvky balíčku
- Vytvořte balíček v PL / SQL
- Předat prohlášení
- Využití kurzorů v balíčku
- Přetížení
- Závislost v balíčcích
- Informace o balíčku
- SOUBOR UTL - přehled
Součásti balíčků
Balíček PL / SQL má dvě složky.
- Specifikace balíčku
- Tělo balení
Specifikace balíčku
Specifikace balíčku sestává z deklarace všech veřejných proměnných, kurzorů, objektů, procedur, funkcí a výjimek.
Níže uvádíme několik charakteristik specifikace balíčku.
- K prvkům, které jsou všechny deklarovány ve specifikaci, lze přistupovat zvenčí balíčku. Takové prvky jsou známé jako veřejné prvky.
- Specifikace balíčku je samostatný prvek, což znamená, že může existovat samostatně bez těla balíčku.
- Kdykoli balíček odkáže, vytvoří se instance balíčku pro danou relaci.
- Poté, co je instance vytvořena pro relaci, jsou všechny prvky balíčku, které jsou inicializovány v dané instanci, platné až do konce relace.
Syntax
CREATE [OR REPLACE] PACKAGEIS … END
Výše uvedená syntaxe ukazuje vytvoření specifikace balíčku.
Tělo balení
Skládá se z definice všech prvků, které jsou obsaženy ve specifikaci balíčku. Může mít také definici prvků, které nejsou deklarovány ve specifikaci, tyto prvky se nazývají soukromé prvky a lze je volat pouze zevnitř balíčku.
Níže jsou uvedeny charakteristiky těla obalu.
- Mělo by obsahovat definice pro všechny podprogramy / kurzory, které byly deklarovány ve specifikaci.
- Může také obsahovat více podprogramů nebo jiných prvků, které nejsou deklarovány ve specifikaci. Nazývají se soukromé prvky.
- Je to spolehlivý objekt a záleží na specifikaci balíčku.
- Stav těla balíčku se při každé kompilaci specifikace stane „Neplatný“. Proto je nutné ji po kompilaci specifikace překompilovat pokaždé.
- Soukromé prvky by měly být definovány jako první, než se použijí v těle balíčku.
- První částí balíčku je část globální deklarace. To zahrnuje proměnné, kurzory a soukromé prvky (deklarace vpřed), které jsou viditelné pro celý balíček.
- Poslední částí balíčku je část Inicializace balíčku, která se provede jednou, kdykoli je balíček poprvé odeslán v relaci.
Syntax:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Výše uvedená syntaxe ukazuje vytvoření těla balíčku.
Nyní uvidíme, jak v programu odkázat na prvky balíčku.
Odkazující prvky balíčku
Jakmile jsou prvky deklarovány a definovány v balíčku, musíme je odkázat na jejich použití.
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řejnou proměnnou balíčku lze také použít stejným způsobem k přiřazení a načtení hodnot z nich, tj. „
Vytvořte balíček v PL / SQL
V PL / SQL při každém odeslání / volání balíčku v relaci bude pro tento balíček vytvořena nová instance.
Oracle poskytuje nástroj pro inicializaci prvků balíčku nebo provádění jakékoli činnosti v době vytváření této instance prostřednictvím „Inicializace balíčku“.
Není to nic jiného než spouštěcí blok, který je zapsán do těla balíčku po definování všech prvků balíčku. Tento blok se provede vždy, když je balíček v relaci odeslán poprvé.
Syntax
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Výše uvedená syntaxe ukazuje definici inicializace balíčku v těle balíčku.
Předat prohlášení
Předání deklarace / odkazu v balíčku není nic jiného než deklarování soukromých prvků samostatně a jejich definování v pozdější části těla balíčku.
Soukromé prvky lze odkazovat, pouze pokud je již deklarováno v těle balíčku. Z tohoto důvodu se používá předávací deklarace. Použití je ale poměrně neobvyklé, protože ve většině případů jsou soukromé prvky deklarovány a definovány v první části těla balíčku.
Předávací deklarace je volba poskytovaná společností Oracle, není povinná a používání a nepoužívání je na požadavcích programátora.
Syntax:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
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.
Využ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 jeho otevření přetrvává až do konce relace.
Proto byste měli vždy používat atributy kurzoru '% ISOPEN' k ověření stavu kurzoru před jeho odesláním.
Přetížení
Přetížení je koncept mít mnoho podprogramů se stejným názvem. Tyto podprogramy se budou od sebe lišit řadou parametrů nebo typů parametrů nebo návratovým typem, tj. Podprogram se stejným názvem, ale s jiným počtem parametrů, jiným typem parametrů nebo jiným přepisem se považuje za přetížení.
To je užitečné, když mnoho podprogramů musí provádět stejný úkol, 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 stejný 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 tabulky emp.
Krok 1) Vytvoření specifikace balíčku
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:/
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 skutečné definice všech postupů a funkcí. V tomto kroku se vytvoří tělo balíčku.
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:/
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. Je to stejné jako definování samostatné procedury v PL / SQL.
- Řádek kódu 17-24: Definování prvku 'get_record'. Je to stejné jako definování samostatné funkce.
- Řádek kódu 25-26: Definování části inicializace balíčku.
Krok 3) Vytvoření anonymního bloku pro vložení a zobrazení záznamů odkazem na výše vytvořený balíček.
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:/
Výstup:
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
Vysvětlení kódu:
- Řádek kódu 34-37: 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. Balíček je nyní vytvořen a bude trvat až do konce relace.
- Část pro inicializaci balíčku je spuštěna, protože se jedná o první volání balíčku.
- Záznam je vložen prvkem 'set_record' do tabulky.
- Řádek kódu 41: Volání prvku 'get_record' pro zobrazení podrobností vloženého zaměstnance.
- Balíček je podruhé odkázán během volání 'get_record' na balíček. Inicializační část se ale tentokrát neprovede, protože balíček je již inicializován v této relaci.
- Řádek kódu 42-45: Tisk podrobností o zaměstnanci.
Závislost v balíčcích
Jelikož balíček představuje logické seskupení souvisejících věcí, má určité závislosti. Následuje závislost, na kterou je třeba dávat pozor.
- Specifikace je samostatný objekt.
- Tělo balíčku závisí na specifikaci.
- Tělo balíčku lze sestavit samostatně. Kdykoli je kompilována specifikace, tělo musí být překompilováno, 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, které jsou uvedeny 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, jsou informace o balíčku, jako je zdroj balíčku, podrobnosti podprogramu a podrobnosti o přetížení, k dispozici v tabulkách definice dat Oracle.
Níže uvedená tabulka uvádí tabulku definice dat a informace o balíčku, které jsou v tabulce k dispozici.
Název tabulky | Popis | Dotaz |
ALL_OBJECT | Poskytuje podrobnosti 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 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 where object_name = '
|
ALL_SOURCE | Poskytuje zdroj objektů vytvořených všemi uživateli. | SELECT * FROM all_source where name = '
|
USER_SOURCE | Poskytuje zdroj objektů vytvořených aktuálním uživatelem. | SELECT * FROM user_source where name = '
|
VŠECHNY POSTUPY | Poskytuje podrobnosti podprogramu jako object_id, podrobnosti o přetížení atd. Vytvořené všemi uživateli. | SELECT * FROM all_procedures Where object_name = '
|
POUŽITELSKÉ POSTUPY | Poskytuje podrobnosti podprogramu, jako je object_id, podrobnosti o přetížení atd. Vytvořené aktuálním uživatelem. | SELECT * FROM user_procedures Where object_name = '
|
SOUBOR UTL - přehled
Soubor UTL je samostatný balíček nástrojů poskytovaný společností Oracle k provádění zvláštních úkolů. Používá se hlavně ke čtení a zápisu souborů operačního systému z balíků nebo podprogramů PL / SQL. Má samostatné funkce pro vkládání informací a pro 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 jakéhokoli typu a soubor se zapíše přímo na databázový server. Při psaní bude uvedeno jméno a cesta k adresáři.
souhrn
Nyní jsme se naučili balíčky v PL / SQL a nyní byste měli být schopni pracovat v následujícím.
- Balíčky PL / SQL a jeho komponenty
- Vlastnosti balení
- Odkazování a přetížení prvků balíčku
- Správa závislostí v balíčcích
- Zobrazení informací o balíčku
- Co je to UTL soubor