Oracle Kolekce PL/SQL: Varrays, Nested & Index by Tables

Co je kolekce?

Kolekce je uspoล™รกdanรก skupina prvkลฏ konkrรฉtnรญch datovรฝch typลฏ. Mลฏลพe se jednat o kolekci jednoduchรฝch datovรฝch typลฏ nebo komplexnรญch datovรฝch typลฏ (jako jsou uลพivatelem definovanรฉ typy nebo typy zรกznamลฏ).

V kolekci je kaลพdรฝ prvek identifikovรกn termรญnem tzv "dolnรญ index." Kaลพdรฉ poloลพce v kolekci je pล™iล™azen jedineฤnรฝ dolnรญ index. S daty v tรฉto kolekci lze manipulovat nebo je naฤรญtat odkazem na tento jedineฤnรฝ dolnรญ index.

Kolekce jsou nejuลพiteฤnฤ›jลกรญ vฤ›ci, kdyลพ je tล™eba zpracovat nebo manipulovat s velkรฝmi daty stejnรฉho typu. Sbรญrky lze naplnit a manipulovat s nimi jako s celkem pomocรญ moลพnosti 'BULK' v Oracle.

Kolekce jsou klasifikovรกny na zรกkladฤ› struktury, dolnรญho indexu a รบloลพiลกtฤ›, jak je uvedeno nรญลพe.

  • Indexovรกnรญ podle tabulek (takรฉ znรกmรฉ jako asociativnรญ pole)
  • Vnoล™enรฉ tabulky
  • Varrays

Na data v kolekci lze kdykoli odkazovat tล™emi pojmy Nรกzev kolekce, Dolnรญ index, Nรกzev pole/sloupce jako โ€ž ( ). โ€œ. O tฤ›chto vรฝลกe uvedenรฝch kategoriรญch kolekcรญ se dozvรญte dรกle v nรญลพe uvedenรฉ sekci.

Varrays

Varray je metoda sbฤ›ru, ve kterรฉ je velikost pole pevnรก. Velikost pole nemลฏลพe bรฝt pล™ekroฤena, neลพ je jeho pevnรก hodnota. Dolnรญ index Varray mรก ฤรญselnou hodnotu. Nรกsledujรญ atributy Varrays.

  • Hornรญ limit velikosti je pevnรฝ
  • Vyplลˆuje se postupnฤ› poฤรญnaje dolnรญm indexem '1'
  • Tento typ kolekce je vลพdy hustรฝ, tj. nemลฏลพeme smazat ลพรกdnรฉ prvky pole. Varray lze smazat jako celek, nebo jej lze od konce oล™รญznout.
  • Vzhledem k tomu, ลพe mรก vลพdy hustou povahu, mรก velmi menลกรญ pruลพnost.
  • Je vhodnฤ›jลกรญ pouลพรญt, kdyลพ je znรกma velikost pole a provรกdฤ›t podobnรฉ ฤinnosti na vลกech prvcรญch pole.
  • Dolnรญ index a sekvence zลฏstรกvajรญ vลพdy stabilnรญ, tj. dolnรญ index a poฤet kolekce jsou vลพdy stejnรฉ.
  • Pล™ed pouลพitรญm v programech je tล™eba je inicializovat. Jakรกkoli operace (kromฤ› operace EXISTS) na neinicializovanรฉ kolekci vyvolรก chybu.
  • Mลฏลพe bรฝt vytvoล™en jako databรกzovรฝ objekt, kterรฝ je viditelnรฝ v celรฉ databรกzi nebo uvnitล™ podprogramu, kterรฝ lze pouลพรญt pouze v tomto podprogramu.

Nรญลพe uvedenรฝ obrรกzek schematicky vysvฤ›tlรญ alokaci pamฤ›ti Varray (hustรก).

Index 1 2 3 4 5 6 7
Hodnota Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntaxe pro VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • Ve vรฝลกe uvedenรฉ syntaxi je nรกzev_typu deklarovรกn jako VARRAY typu 'DATA_TYPE' pro danรฝ limit velikosti. Datovรฝ typ mลฏลพe bรฝt jednoduchรฝ nebo komplexnรญ typ.

Vnoล™enรฉ tabulky

Vnoล™enรก tabulka je kolekce, ve kterรฉ nenรญ velikost pole pevnรก. Mรก ฤรญselnรฝ typ dolnรญho indexu. Nรญลพe jsou uvedeny dalลกรญ popisy typu vnoล™enรฝch tabulek.

  • Vnoล™enรก tabulka nemรก hornรญ limit velikosti.
  • Vzhledem k tomu, ลพe hornรญ limit velikosti nenรญ pevnฤ› danรฝ, je potล™eba pamฤ›ลฅ kolekce rozลกรญล™it pokaลพdรฉ, neลพ ji pouลพijeme. Kolekci mลฏลพeme rozลกรญล™it pomocรญ klรญฤovรฉho slova 'EXTEND'.
  • Vyplลˆuje se postupnฤ› poฤรญnaje dolnรญm indexem '1'.
  • Tento typ kolekce mลฏลพe bรฝt obojรญho hustรฉ a ล™รญdkรฉ, tj. mลฏลพeme vytvoล™it kolekci jako hustou, a takรฉ mลฏลพeme nรกhodnฤ› odstranit jednotlivรฉ prvky pole, ฤรญmลพ se stane ล™รญdkou.
  • Poskytuje vฤ›tลกรญ flexibilitu pล™i odstraลˆovรกnรญ prvku pole.
  • Je uloลพena v systรฉmovฤ› generovanรฉ databรกzovรฉ tabulce a lze ji pouลพรญt ve vรฝbฤ›rovรฉm dotazu k naฤtenรญ hodnot.
  • Dolnรญ index a sekvence nejsou stabilnรญ, tj. dolnรญ index a poฤet prvkลฏ pole se mohou liลกit.
  • Pล™ed pouลพitรญm v programech je tล™eba je inicializovat. Jakรกkoli operace (kromฤ› operace EXISTS) na neinicializovanรฉ kolekci vyvolรก chybu.
  • Mลฏลพe bรฝt vytvoล™en jako databรกzovรฝ objekt, kterรฝ je viditelnรฝ v celรฉ databรกzi nebo uvnitล™ podprogramu, kterรฝ lze pouลพรญt pouze v tomto podprogramu.

Nรญลพe uvedenรฝ obrรกzek schematicky vysvฤ›tlรญ alokaci pamฤ›ti vnoล™enรฉ tabulky (hustรก a ล™รญdkรก). ฤŒernฤ› zbarvenรฝ prostor prvku oznaฤuje prรกzdnรฝ prvek v kolekci, tj. ล™รญdkรฝ.

Index 1 2 3 4 5 6 7
Hodnota (hustรก) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Hodnota (ล™รญdkรก) Qwe Asd Afg Asd Wer

Syntaxe pro vnoล™enou tabulku:

TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
  • Ve vรฝลกe uvedenรฉ syntaxi je nรกzev_typu deklarovรกn jako kolekce vnoล™enรฝch tabulek typu 'DATA_TYPE'. Datovรฝ typ mลฏลพe bรฝt jednoduchรฝ nebo komplexnรญ typ.

Index podle tabulky

Index-by-table je kolekce, ve kterรฉ nenรญ velikost pole pevnรก. Na rozdรญl od jinรฝch typลฏ kolekcรญ mลฏลพe v kolekci index-by-table dolnรญ index sestรกvat z definovรกnรญ uลพivatelem. Nรกsledujรญ atributy index-by-table.

  • Dolnรญ index mลฏลพe mรญt celรฉ ฤรญslo nebo ล™etฤ›zce. Pล™i vytvรกล™enรญ kolekce by mฤ›l bรฝt uveden typ dolnรญho indexu.
  • Tyto kolekce se neuklรกdajรญ sekvenฤnฤ›.
  • V pล™รญrodฤ› jsou vลพdy ล™รญdkรฉ.
  • Velikost pole nenรญ pevnรก.
  • Nelze je uloลพit do sloupce databรกze. Musรญ bรฝt vytvoล™eny a pouลพity v jakรฉmkoli programu v danรฉ konkrรฉtnรญ relaci.
  • Poskytujรญ vฤ›tลกรญ flexibilitu, pokud jde o udrลพovรกnรญ dolnรญho indexu.
  • Indexy mohou mรญt takรฉ zรกpornou sekvenci indexลฏ.
  • Je vhodnฤ›jลกรญ je pouลพรญt pro relativnฤ› menลกรญ hromadnรฉ hodnoty, ve kterรฝch lze kolekci inicializovat a pouลพรญvat v rรกmci stejnรฝch podprogramลฏ.
  • Nenรญ tล™eba je inicializovat, neลพ je zaฤnete pouลพรญvat.
  • Nelze jej vytvoล™it jako databรกzovรฝ objekt. Lze jej vytvoล™it pouze uvnitล™ podprogramu, kterรฝ lze pouลพรญt pouze v tomto podprogramu.
  • BULK COLLECT nelze pouลพรญt v tomto typu kolekce, protoลพe dolnรญ index by mฤ›l bรฝt uveden vรฝslovnฤ› pro kaลพdรฝ zรกznam v kolekci.

Nรญลพe uvedenรฝ obrรกzek schematicky vysvฤ›tlรญ alokaci pamฤ›ti vnoล™enรฉ tabulky (ล™รญdkรฉ). ฤŒernฤ› zbarvenรฝ prostor prvku oznaฤuje prรกzdnรฝ prvek v kolekci, tj. ล™รญdkรฝ.

Dolnรญ index (varchar) PRVNร DRUHร Tล˜ETร ฤŒTVRTร PรTร ล ESTร SEDMร
Hodnota (ล™รญdkรก) Qwe Asd Afg Asd Wer

Syntaxe pro indexovรกnรญ podle tabulky

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Ve vรฝลกe uvedenรฉ syntaxi je nรกzev_typu deklarovรกn jako kolekce indexลฏ podle tabulky typu 'DATA_TYPE'. Datovรฝ typ mลฏลพe bรฝt jednoduchรฝ nebo komplexnรญ typ. Promฤ›nnรก subsciprt/index je uvedena jako typ VARCHAR2 s maximรกlnรญ velikostรญ 10.

Konstruktor a inicializaฤnรญ koncept v kolekcรญch

Konstruktory jsou vestavฤ›nรฉ funkce poskytovanรฉ vฤ›ลกtcem, kterรฉ majรญ stejnรฝ nรกzev jako objekt nebo kolekce. Jsou spuลกtฤ›ny jako prvnรญ vลพdy, kdyลพ jsou objekt nebo kolekce poprvรฉ v relaci odkazovรกny. Nรญลพe jsou uvedeny dลฏleลพitรฉ podrobnosti konstruktoru v kontextu kolekce:

  • U kolekcรญ by tyto konstruktory mฤ›ly bรฝt volรกny explicitnฤ›, aby je inicializovaly.
  • Jak tabulky Varray, tak vnoล™enรฉ tabulky musรญ bรฝt inicializovรกny prostล™ednictvรญm tฤ›chto konstruktorลฏ, neลพ budou odkazovรกny do programu.
  • Konstruktor implicitnฤ› rozลกiล™uje alokaci pamฤ›ti pro kolekci (kromฤ› Varray), takลพe konstruktor mลฏลพe takรฉ pล™iล™adit promฤ›nnรฉ ke kolekcรญm.
  • Pล™iล™azenรญ hodnot kolekci pomocรญ konstruktorลฏ nikdy neuฤinรญ kolekci ล™รญdkou.

Metody sbฤ›ru

Oracle poskytuje mnoho funkcรญ pro manipulaci a prรกci s kolekcemi. Tyto funkce jsou v programu velmi uลพiteฤnรฉ pro urฤenรญ a รบpravu rลฏznรฝch atributลฏ kolekcรญ. V nรกsledujรญcรญ tabulce jsou uvedeny rลฏznรฉ funkce a jejich popis.

Metoda Description SYNTAX
EXISTUJE (n) Tato metoda vrรกtรญ booleovskรฉ vรฝsledky. Vrรกtรญ 'TRUE', pokud nth prvek v tรฉto kolekci existuje, jinak vrรกtรญ FALSE. V neinicializovanรฉ kolekci lze pouลพรญt pouze funkce EXISTS .EXISTS(pozice_prvku)
COUNT Udรกvรก celkovรฝ poฤet prvkลฏ pล™รญtomnรฝch v kolekci .POฤŒET
LIMIT Vrรกtรญ maximรกlnรญ velikost kolekce. Pro Varray vrรกtรญ pevnou velikost, kterรก byla definovรกna. Pro vnoล™enou tabulku a index podle tabulky dรกvรก hodnotu NULL .OMEZIT
PRVNร Vrรกtรญ hodnotu prvnรญ indexovรฉ promฤ›nnรฉ (dolnรญho indexu) kolekcรญ .PRVNร
LAST Vrรกtรญ hodnotu poslednรญ indexovรฉ promฤ›nnรฉ (dolnรญho indexu) kolekcรญ .POSLEDNร
Pล˜EDCHOZร (n) Vrรกtรญ pล™ed promฤ›nnou indexu v kolekci nth ลพivel. Pokud neexistujรญ ลพรกdnรฉ pล™edล™azenรฉ indexy, vrรกtรญ se hodnota NULL .PRIOR(n)
DALล ร (n) Vrรกtรญ รบspฤ›ลกnou indexovou promฤ›nnou v kolekci nth ลพivel. Pokud neexistuje ลพรกdnรฝ รบspฤ›ลกnรฝ index, je vrรกcena hodnota NULL .NEXT(n)
ROZล รล˜IT Rozลกiล™uje jeden prvek v kolekci na konci .ROZล รล˜IT
PRODLOUลฝIT (n) Rozลกiล™uje n prvkลฏ na konci kolekce .EXTEND(n)
PRODLOUลฝIT (n,i) Rozลกiล™uje n kopiรญ ith prvek na konci kolekce .EXTEND(n,i)
TRIM Odebere jeden prvek z konce kolekce .TRIM
TRIM (n) Odebere n prvkลฏ z konce kolekce .TRIM (n)
DELETE Odstranรญ vลกechny prvky z kolekce. Vyprรกzdnรญ sbรญrku .VYMAZAT
DELETE (n) Odstranรญ n-tรฝ prvek z kolekce. Pokud nth prvek je NULL, pak to nic neudฤ›lรก .DELETE(n)
ODSTRANIT (m, n) Odstranรญ prvek v rozsahu mth do nth ve sbรญrce .DELETE(m;n)

Pล™รญklad1: Typ zรกznamu na รบrovni podprogramu

V tomto pล™รญkladu uvidรญme, jak naplnit kolekci pomocรญ 'VELKร SBฤšRโ€œ a jak odkazovat na data sbรญrky.

Typ zรกznamu na รบrovni podprogramu

DECLARE
TYPE 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(); 
BEGIN
INSERT 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_rec
FROM emp;
dbms_output.put_line (โ€˜Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_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;
/

Vysvฤ›tlenรญ kรณdu:

  • ล˜รกdek kรณdu 2-8: Typ zรกznamu 'emp_det' je deklarovรกno se sloupci emp_no, emp_name, plat a manaลพer datovรฉho typu NUMBER, VARCHAR2, NUMBER, NUMBER.
  • ล˜รกdek kรณdu 9: Vytvoล™enรญ kolekce 'emp_det_tbl' prvku typu zรกznamu 'emp_det'
  • ล˜รกdek kรณdu 10: Deklaruje promฤ›nnou 'guru99_emp_rec' jako typ 'emp_det_tbl' a inicializuje ji konstruktorem null.
  • ล˜รกdek 12โ€“15 kรณdu: Vloลพenรญ ukรกzkovรฝch dat do tabulky 'emp'.
  • ล˜รกdek kรณdu 16: Potvrzenรญ transakce vloลพenรญ.
  • ล˜รกdek kรณdu 17: Naฤtenรญ zรกznamลฏ z tabulky 'emp' a naplnฤ›nรญ promฤ›nnรฉ kolekce jako hromadnรฉ pomocรญ pล™รญkazu โ€žBULK COLLECTโ€œ. Nynรญ promฤ›nnรก 'guru99_emp_rec' obsahuje vลกechny zรกznamy, kterรฉ jsou pล™รญtomny v tabulce 'emp'.
  • ล˜รกdek 19โ€“26 kรณdu: Nastavenรญ smyฤky 'FOR' pro tisk vลกech zรกznamลฏ v kolekci jeden po druhรฉm. Metoda sbฤ›ru FIRST and LAST se pouลพรญvรก jako spodnรญ a hornรญ hranice smyฤka.

Vรฝstup: Jak mลฏลพete vidฤ›t na vรฝลกe uvedenรฉm snรญmku obrazovky, po provedenรญ vรฝลกe uvedenรฉho kรณdu zรญskรกte nรกsledujรญcรญ vรฝstup

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------

Shrลˆte tento pล™รญspฤ›vek takto: