Čo je balík v systéme Oracle?
Balík PL / SQL je logické zoskupenie súvisiaceho podprogramu (procedúry / funkcie) do jedného prvku. Balík je zostavený a uložený ako databázový objekt, ktorý je možné neskôr použiť.
V tomto návode sa naučíte
- Súčasti balíkov
- Špecifikácia balenia
- Telo balenia
- Odkazujúce prvky balíka
- Vytvorte balík v PL / SQL
- Budúce vyhlásenia
- Používanie kurzorov v balení
- Preťaženie
- Závislosť v balíkoch
- Informácie o balíku
- SÚBOR UTL - prehľad
Súčasti balíkov
Balík PL / SQL má dve zložky.
- Špecifikácia balenia
- Telo balenia
Špecifikácia balenia
Špecifikácia balíka pozostáva z deklarácie všetkých verejných premenných, kurzorov, objektov, postupov, funkcií a výnimiek.
Ďalej uvádzame niekoľko charakteristík špecifikácie balíka.
- K prvkom, ktoré sú všetky deklarované v špecifikácii, je prístup z vonkajšej strany balíka. Takéto prvky sú známe ako verejný prvok.
- Špecifikácia balíka je samostatný prvok, čo znamená, že môže existovať samostatne bez tela balíka.
- Kedykoľvek balík odkáže, vytvorí sa inštancia balíka pre konkrétnu reláciu.
- Po vytvorení inštancie pre reláciu sú všetky prvky balíka, ktoré sa inicializujú v tejto inštancii, platné až do konca relácie.
Syntax
CREATE [OR REPLACE] PACKAGEIS … END
Vyššie uvedená syntax ukazuje vytvorenie špecifikácie balíka.
Telo balenia
Pozostáva z definície všetkých prvkov, ktoré sú obsiahnuté v špecifikácii balíka. Môže mať aj definíciu prvkov, ktoré nie sú deklarované v špecifikácii, tieto prvky sa nazývajú súkromné prvky a dajú sa volať iba z vnútra balíka.
Ďalej sú uvedené charakteristiky tela obalu.
- Mal by obsahovať definície všetkých podprogramov / kurzorov, ktoré boli deklarované v špecifikácii.
- Môže tiež obsahovať viac podprogramov alebo iných prvkov, ktoré nie sú deklarované v špecifikácii. Nazývajú sa súkromné prvky.
- Je to spoľahlivý objekt a závisí to od špecifikácie balíka.
- Stav tela balíka sa stane „Neplatný“ pri každej kompilácii špecifikácie. Preto je potrebné ju po kompilácii špecifikácie prekompilovať vždy.
- Pred použitím v tele balíka by mali byť definované najskôr súkromné prvky.
- Prvou časťou balíka je časť s globálnou deklaráciou. Patria sem premenné, kurzory a súkromné prvky (deklarácia dopredu), ktoré sú viditeľné pre celý balík.
- Poslednou časťou balíka je časť Inicializácia balíka, ktorá sa vykoná jednorazovo vždy, keď sa balík v relácii odošle prvýkrát.
Syntax:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Vyššie uvedená syntax ukazuje vytvorenie tela balíka.
Teraz uvidíme, ako odkázať na prvky balíka v programe.
Odkazujúce prvky balíka
Keď sú prvky deklarované a definované v balíku, musíme ich odkázať na ich použitie.
Všetky verejné prvky balíka je možné odkázať volaním názvu balíka, za ktorým nasleduje názov prvku oddelený bodkou, tj. „
Verejná premenná balíka sa dá rovnakým spôsobom použiť aj na priradenie a načítanie hodnôt z nich, tj „
Vytvorte balík v PL / SQL
V PL / SQL kedykoľvek sa v relácii odošle / zavolá balík, vytvorí sa pre tento balík nová inštancia.
Spoločnosť Oracle poskytuje nástroj na inicializáciu prvkov balíka alebo na vykonávanie akejkoľvek činnosti v čase vytvárania tejto inštancie prostredníctvom „Inicializácie balíka“.
Nejde o nič iné ako o vykonávací blok, ktorý sa zapíše do tela balíka po definovaní všetkých prvkov balíka. Tento blok sa vykoná vždy, keď sa na balík v relácii odkazuje prvýkrát.
Syntax
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Vyššie uvedená syntax zobrazuje definíciu inicializácie balíka v tele balíka.
Budúce vyhlásenia
Predané vyhlásenie / odkaz v balíku nie je nič iné, ako deklarovanie súkromných prvkov osobitne a ich definovanie v neskoršej časti tela balíka.
Na súkromné prvky je možné odkazovať, iba ak je to už deklarované v tele balíka. Z tohto dôvodu sa používa forwardové vyhlásenie. Použitie je ale dosť neobvyklé, pretože väčšinou sú súkromné prvky deklarované a definované v prvej časti tela balíka.
Forward vyhlásenie je voľba poskytovaná spoločnosťou Oracle, nie je povinná a používanie a nepoužívanie je v súlade s požiadavkami programátora.
Syntax:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Vyššie uvedená syntax zobrazuje forwardovú deklaráciu. Súkromné prvky sú deklarované osobitne v prednej časti balíka a boli definované v neskoršej časti.
Používanie kurzorov v balení
Na rozdiel od iných prvkov je pri používaní kurzorov vo vnútri balenia potrebné postupovať opatrne.
Ak je kurzor definovaný v špecifikácii balíka alebo v globálnej časti tela balíka, potom po otvorení kurzora pretrvá až do konca relácie.
Preto by ste mali vždy používať atribúty kurzora '% ISOPEN' na overenie stavu kurzora pred jeho odoslaním.
Preťaženie
Preťaženie je koncept vytvárania mnohých podprogramov s rovnakým názvom. Tieto podprogramy sa budú navzájom líšiť počtom parametrov alebo typov parametrov alebo návratového typu, tj podprogram s rovnakým názvom, ale s iným počtom parametrov, iným typom parametrov alebo iným typom zmeny sa považujú za preťaženie.
Je to užitočné, keď mnoho podprogramov musí robiť rovnakú úlohu, ale spôsob, ako zavolať každý z nich, by mal byť iný. V takom prípade sa názov podprogramu zachová pre všetkých rovnaký a parametre sa zmenia podľa volajúceho výpisu.
Príklad 1 : V tomto príklade vytvoríme balík na získanie a nastavenie hodnôt informácií o zamestnancovi v tabuľke „emp“. Funkcia get_record vráti výstup typu záznamu pre dané číslo zamestnanca a procedúra set_record vloží záznam typu záznamu do tabuľky emp.
Krok 1) Vytvorenie špecifikácie balíka
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ýkon:
Package created
Vysvetlenie kódu
- Riadok kódu 1-5 : Vytvorenie špecifikácie balíka pre guru99_get_set s jednou procedúrou a jednou funkciou. Tieto dva prvky sú teraz verejnými prvkami tohto balíka.
Krok 2) Balík obsahuje telo balíka, kde budú definované všetky definície procedúr a funkcií. V tomto kroku sa vytvorí telo balíka.
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ýkon:
Package body created
Vysvetlenie kódu
- Riadok kódu 7 : Vytvorenie tela balíka.
- Riadok kódu 9-16 : Definovanie prvku 'set_record', ktorý je deklarovaný v špecifikácii. Je to rovnaké ako s definovaním samostatnej procedúry v PL / SQL.
- Riadok kódu 17-24: Definovanie prvku 'get_record'. Je to rovnaké ako s definovaním samostatnej funkcie.
- Riadok kódu 25-26: Definovanie časti inicializácie balíka.
Krok 3) Vytvorenie anonymného bloku na vloženie a zobrazenie záznamov podľa vyššie vytvoreného balíka.
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ýkon:
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
Vysvetlenie kódu:
- Riadok kódu 34-37: Vyplnenie údajov pre premennú typu záznamu v anonymnom bloku na vyvolanie prvku „set_record“ balíka.
- Riadok kódu 38: Uskutočnil sa hovor na „set_record“ balíka guru99_get_set. Teraz je balík inštancovaný a bude pretrvávať až do konca relácie.
- Inicializačná časť balíka sa vykoná, pretože toto je prvé volanie balíka.
- Záznam je vložený prvkom „set_record“ do tabuľky.
- Riadok kódu 41: Volanie prvku „get_record“ na zobrazenie podrobností o vloženom zamestnancovi.
- Balík je odoslaný druhýkrát počas hovoru 'get_record' na balík. Inicializačná časť sa ale tentokrát nevykoná, pretože balík je už inicializovaný v tejto relácii.
- Riadok kódu 42-45: Tlač podrobností o zamestnancovi.
Závislosť v balíkoch
Pretože balík predstavuje logické zoskupenie súvisiacich vecí, má určité závislosti. Nasleduje závislosť, o ktorú sa treba starať.
- Špecifikácia je samostatný objekt.
- Telo balíka závisí od špecifikácie.
- Telo balenia je možné zostaviť samostatne. Pri každej kompilácii špecifikácie je potrebné telo znova kompilovať, pretože sa stane neplatným.
- Podprogram v tele balíka, ktorý je závislý na súkromnom prvku, by sa mal definovať až po vyhlásení súkromného prvku.
- Databázové objekty, ktoré sú uvedené v špecifikácii a tele, musia byť v čase kompilácie balíka v platnom stave.
Informácie o balíku
Po vytvorení informácií o balíku sú v tabuľkách definícií údajov Oracle dostupné informácie o balíku, ako napríklad zdroj balíka, podrobnosti podprogramu a podrobnosti preťaženia.
V nasledujúcej tabuľke je uvedená tabuľka definícií údajov a informácie o balíku, ktoré sú v nej k dispozícii.
Názov tabuľky | Popis | Dopyt |
ALL_OBJECT | Uvádza podrobnosti balíka ako object_id, creation_date, last_ddl_time atď. Bude obsahovať objekty vytvorené všetkými používateľmi. | SELECT * FROM all_objects where object_name = '
|
USER_OBJECT | Uvádza podrobnosti balíka ako object_id, creation_date, last_ddl_time atď. Bude obsahovať objekty vytvorené aktuálnym používateľom. | SELECT * FROM user_objects where object_name = '
|
ALL_SOURCE | Poskytuje zdroj objektov vytvorených všetkými používateľmi. | SELECT * FROM all_source where name = '
|
USER_SOURCE | Poskytuje zdroj objektov vytvorených aktuálnym používateľom. | SELECT * FROM user_source where name = '
|
VŠETKY POSTUPY | Poskytuje podrobnosti podprogramu ako object_id, podrobnosti preťaženia atď. Vytvorené všetkými používateľmi. | SELECT * FROM all_procedures Where object_name = '
|
USER_PROCEDURES | Poskytuje podrobnosti podprogramu, ako je object_id, podrobnosti preťaženia atď., Ktoré vytvoril aktuálny používateľ. | SELECT * FROM user_procedures Where object_name = '
|
SÚBOR UTL - prehľad
UTL File je samostatný obslužný balík poskytovaný spoločnosťou Oracle na vykonávanie špeciálnych úloh. Používa sa hlavne na čítanie a zápis súborov operačného systému z balíkov alebo podprogramov PL / SQL. Má samostatné funkcie na vkladanie informácií a na získavanie informácií zo súborov. Umožňuje tiež čítanie a zápis v natívnej znakovej sade.
Programátor to môže použiť na zápis súborov operačného systému ľubovoľného typu a súbor sa zapíše priamo na databázový server. Pri písaní bude uvedené meno a cesta k adresáru.
Zhrnutie
Teraz sme sa naučili balíky v PL / SQL a teraz by ste mali byť schopní pracovať nasledovne.
- Balíky PL / SQL a ich komponenty
- Charakteristika balíkov
- Sprostredkovanie a preťaženie prvkov balíka
- Správa závislostí v balíkoch
- Prezeranie informácií o balíku
- Čo je súbor UTL