Balík Oracle PL / SQL: typ, špecifikácia, telo (príklad)

Obsah:

Anonim

Č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] PACKAGE 
IS… 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 BODY 
IS.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 BODY 
IS.BEGINEEND 
  • 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 BODY 
IS.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