Kolekcie Oracle PL / SQL: Varrays, Nested & Index podľa tabuliek

Čo je to zbierka?

Zbierka je usporiadaná skupina prvkov konkrétnych dátových typov. Môže to byť kolekcia jednoduchých dátových typov alebo zložitých dátových typov (napríklad používateľom definované alebo typy záznamov).

V zbierke je každý prvok identifikovaný výrazom nazývaným „dolný index“. Každá položka v zbierke má priradený jedinečný dolný index. S údajmi v tejto kolekcii je možné manipulovať alebo načítať odkaz na tento jedinečný dolný index.

Zbierky sú najužitočnejšie veci, keď je potrebné spracovať alebo manipulovať s veľkými údajmi rovnakého typu. Zbierky je možné naplniť a manipulovať s nimi ako celok pomocou voľby „HROMADNE“ v systéme Oracle.

V tomto návode sa naučíte

  • Čo je to zbierka?
  • Varrays
  • Vnorené tabuľky
  • Index-by-table
  • Konštruktér a koncepcia inicializácie v zbierkach
  • Metódy zberu

Zbierky sú klasifikované na základe štruktúry, dolného indexu a ukladacieho priestoru, ako je uvedené nižšie.

  • Index-by-tables (tiež známy ako Associative Array)
  • Vnorené tabuľky
  • Varrays

Údaje v zbierke možno kedykoľvek označiť tromi výrazmi Názov zbierky, Dolný index, Názov poľa / stĺpca ako „ (). “. O týchto vyššie uvedených kategóriách zbierok sa dozviete ďalej v nasledujúcej časti.

Varrays

Varray je metóda zhromažďovania, pri ktorej je pevná veľkosť poľa. Veľkosť poľa nemôže byť prekročená, ako je jeho pevná hodnota. Dolný index Varray má číselnú hodnotu. Nasledujú atribúty Varrays.

  • Veľkosť horného limitu je pevná
  • Zaľudnené postupne počnúc dolným indexom „1“
  • Tento typ kolekcie je vždy hustý, tj nemôžeme vymazať žiadne prvky poľa. Varray je možné vymazať ako celok, alebo ho možno od konca orezávať.
  • Pretože má vždy hustú povahu, má veľmi menšiu pružnosť.
  • Je vhodnejšie použiť, keď je známa veľkosť poľa, a vykonávať podobné činnosti na všetkých prvkoch poľa.
  • Dolný index a sekvencia zostávajú vždy stabilné, tj. Dolný index a počet zbierok je vždy rovnaký.
  • Pred použitím v programoch je potrebné ich inicializovať. Akákoľvek operácia (okrem operácie EXISTUJE) na neinicializovanej kolekcii spôsobí chybu.
  • Môže byť vytvorený ako databázový objekt, ktorý je viditeľný v celej databáze alebo vo vnútri podprogramu, ktorý je možné použiť iba v tomto podprograme.

Na nasledujúcom obrázku je schematicky vysvetlené rozdelenie pamäte Varray (husté).

Dolný index 1 2 3 4 5 6 7
Hodnota Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntax pre VARRAY:

TYPE  IS VARRAY () OF ;
  • Vo vyššie uvedenej syntaxi je typ_name deklarovaný ako VARRAY typu „DATA_TYPE“ pre daný limit veľkosti. Dátový typ môže byť buď jednoduchého, alebo zložitého typu.

Vnorené tabuľky

Vnorená tabuľka je kolekcia, v ktorej nie je pevná veľkosť poľa. Má číselný typ dolného indexu. Ďalej uvádzame ďalšie popisy typu vnorenej tabuľky.

  • Vnorená tabuľka nemá žiadny horný limit veľkosti.
  • Pretože horný limit veľkosti nie je stanovený, kolekcia musí byť pamäť rozšírená zakaždým, ako ju použijeme. Zbierku môžeme rozšíriť pomocou kľúčového slova „EXTEND“.
  • Založené postupne od dolného indexu „1“.
  • Tento typ kolekcie môže byť hustý aj riedky , tj. Kolekciu môžeme vytvoriť ako hustú a môžeme tiež náhodne vymazať jednotlivé prvky poľa, čím sa stane riedkym.
  • Poskytuje väčšiu flexibilitu, pokiaľ ide o odstránenie prvku poľa.
  • Je uložený v systémovo vygenerovanej databázovej tabuľke a je možné ho použiť vo výberovom dotaze na načítanie hodnôt.
  • Dolný index a postupnosť nie sú stabilné, tj. Dolný index a počet prvkov poľa sa môžu líšiť.
  • Pred použitím v programoch je potrebné ich inicializovať. Akákoľvek operácia (okrem operácie EXISTUJE) na neinicializovanej kolekcii spôsobí chybu.
  • Môže byť vytvorený ako databázový objekt, ktorý je viditeľný v celej databáze alebo vo vnútri podprogramu, ktorý je možné použiť iba v tomto podprograme.

Na nasledujúcom obrázku je schematicky vysvetlené alokovanie pamäte vnorenej tabuľky (hustá a riedka). Čierne zafarbený priestor prvkov označuje prázdny prvok v zbierke, tj riedky.

Dolný index 1 2 3 4 5 6 7
Hodnota (hustá) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Hodnota (riedka) Qwe Asd Afg Asd Wer

Syntax pre vnorenú tabuľku:

TYPE  IS TABLE OF ;
  • Vo vyššie uvedenej syntaxi je type_name deklarovaný ako kolekcia vnorenej tabuľky typu „DATA_TYPE“. Dátový typ môže byť buď jednoduchého, alebo zložitého typu.

Index-by-table

Index-by-table je kolekcia, v ktorej nie je pevná veľkosť poľa. Na rozdiel od iných typov kolekcií môže v kolekcii index-by-table index tvoriť používateľ, ktorý môže byť definovaný sám. Nasledujú atribúty indexu podľa tabuľky.

  • Dolný index môže byť celé číslo alebo reťazec. V čase vytvárania zbierky by sa mal uviesť typ dolného indexu.
  • Tieto zbierky sa neukladajú postupne.
  • V prírode sú vždy riedke.
  • Veľkosť poľa nie je pevná.
  • Nemôžu byť uložené v stĺpci databázy. Budú vytvorené a použité v akomkoľvek programe v príslušnej relácii.
  • Poskytujú väčšiu flexibilitu, pokiaľ ide o zachovanie dolného indexu.
  • Dolné indexy môžu byť tiež negatívnej dolnej sekvencie.
  • Je vhodnejšie ich použiť pre relatívne menšie kolektívne hodnoty, v ktorých je možné zbierku inicializovať a použiť v rámci rovnakých podprogramov.
  • Pred použitím ich nie je potrebné inicializovať.
  • Nemožno ho vytvoriť ako databázový objekt. Môže byť vytvorený iba vo vnútri podprogramu, ktorý je možné použiť iba v tomto podprograme.
  • V tomto type kolekcie nemožno použiť BULK COLLECT, pretože dolný index by mal byť uvedený výslovne pre každý záznam v kolekcii.

Na nasledujúcom obrázku je schematicky vysvetlené alokovanie pamäte vnorenej tabuľky (riedke). Čierne zafarbený priestor prvkov označuje prázdny prvok v zbierke, tj riedky.

Dolný index (varchar) NAJPRV DRUHÉ TRETÍ ŠTVRTÝ PIATY ŠIESTY SEDEM
Hodnota (riedka) Qwe Asd Afg Asd Wer

Syntax pre index podľa tabuľky

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • Vo vyššie uvedenej syntaxi je type_name deklarovaný ako kolekcia index-by-table typu 'DATA_TYPE'. Dátový typ môže byť buď jednoduchého, alebo zložitého typu. Premenná subsciprt / index je uvedená ako typ VARCHAR2 s maximálnou veľkosťou 10.

Konštruktér a koncepcia inicializácie v zbierkach

Konštruktory sú zabudovanou funkciou poskytovanou Oracle, ktorá má rovnaký názov ako objekt alebo kolekcie. Vykonajú sa najskôr, kedykoľvek sa na objekt alebo kolekcie odkazuje v relácii prvýkrát. Nižšie sú uvedené dôležité podrobnosti konštruktora v kontexte kolekcie:

  • Pre kolekcie by sa tieto konštruktory mali explicitne volať, aby sa inicializovali.
  • Tabuľky Varray aj Nested je potrebné pred uvedením do programu inicializovať prostredníctvom týchto konštruktorov.
  • Konštruktor implicitne rozširuje alokáciu pamäte pre kolekciu (okrem Varray), preto môže konštruktor tiež priradiť premenné do kolekcií.
  • Priradením hodnôt do kolekcie prostredníctvom konštruktorov sa kolekcia nikdy nestane riedkou.

Metódy zberu

Oracle poskytuje mnoho funkcií na manipuláciu a prácu so zbierkami. Tieto funkcie sú v programe veľmi užitočné na určenie a úpravu rôznych atribútov zbierok. Nasledujúca tabuľka poskytuje rôzne funkcie a ich popis.

Metóda Popis SYNTAX
EXISTUJE (n) Táto metóda vráti booleovské výsledky. Ak v tejto kolekcii existuje n- prvok, vráti hodnotu „TRUE“ , inak vráti hodnotu FALSE. V neinicializovanej zbierke je možné použiť iba funkcie EXISTUJÚCE .EXISTS (pozícia_prvku)
COUNT Poskytuje celkový počet prvkov prítomných v kolekcii .COUNT
LIMIT Vráti maximálnu veľkosť zbierky. Pre Varray vráti pevnú veľkosť, ktorá bola definovaná. Pre vnorenú tabuľku a index podľa tabuľky dáva NULL .LIMIT
NAJPRV Vráti hodnotu prvej premennej indexu (dolného indexu) kolekcií . PRVÝ
POSLEDNÉ Vráti hodnotu poslednej premennej indexu (dolného indexu) kolekcií .LAST
PRIOR (n) Vráti predchodnú premennú indexu v kolekcii n- tého prvku. Ak hodnota indexu predchádza, vráti sa NULL .PRIOR (n)
ĎALŠIE (n) Vráti úspešnú indexovú premennú v kolekcii n- tého prvku. Ak nie je žiadny úspešný, vráti sa hodnota indexu NULL .NEXT (n)
ROZŠÍRTE Na konci rozšíri jeden prvok v kolekcii .EXTEND
ROZŠÍR (n) Rozširuje n prvkov na konci kolekcie .EXTEND (n)
EXTEND (n, i) Rozširuje n kópií i- teho prvku na konci zbierky .EXTEND (n, i)
TRIM Odstráni jeden prvok z konca kolekcie .TRIM
TRIM (n) Odstráni n prvkov z konca zbierky .TRIM (n)
ODSTRÁNIŤ Vymaže všetky prvky zo zbierky. Robí zbierku prázdnou . DELETE
ODSTRÁNIŤ (n) Vymaže n-tý prvok zo zbierky. Ak je n- prvok NULL, potom to neurobí nič .DELETE (n)
DELETE (m, n) Odstráni prvok v rozmedzí m th až n th v zbierke .DELETE (m, n)

Príklad 1: Typ záznamu na úrovni podprogramu

V tomto príklade sa pozrieme na to, ako naplniť kolekciu pomocou programu „BULK COLLECT“ a ako odkázať na dáta kolekcie.

DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/

Vysvetlenie kódu:

  • Riadok kódu 2-8 : Typ záznamu „emp_det“ je deklarovaný so stĺpcami emp_no, emp_name, plat a správca údajového typu NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Riadok kódu 9: Vytvorenie kolekcie „emp_det_tbl“ prvku typu záznamu „emp_det“
  • Riadok kódu 10: Deklarácia premennej „guru99_emp_rec“ ako typu „emp_det_tbl“ a inicializovaná nulovým konštruktorom.
  • Riadok kódu 12-15: Vloženie vzorových údajov do tabuľky „emp“.
  • Riadok kódu 16: Potvrdenie transakcie vloženia.
  • Riadok kódu 17: Načítanie záznamov z tabuľky „emp“ a vyplnenie premennej kolekcie hromadne pomocou príkazu „BULK COLLECT“. Teraz premenná 'guru99_emp_rec' obsahuje všetky záznamy, ktoré sa nachádzajú v tabuľke 'emp'.
  • Riadok kódu 19-26: Nastavenie slučky „FOR“ na tlač jednotlivých záznamov v zbierke po jednom. Ako dolná a horná hranica slučky sa používa metóda FIRST and LAST.

Výstup : Ako vidíte na snímke vyššie, po vykonaní vyššie uvedeného kódu získate nasledujúci výstup

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------

Zaujímavé články...