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.
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 ----------------------------------------------

