Oracle Kolekce PL/SQL: Varrays, Nested & Index by Tables
โก Chytrรฉ shrnutรญ
Kolekce v PL/SQL jsou uspoลรกdanรฉ skupiny prvkลฏ stejnรฉho datovรฉho typu, kaลพdรฝ z nich je dosaลพitelnรฝ pomocรญ dolnรญho indexu. Tลi typy, Varray, vnoลenรก tabulka a indexovanรก tabulka, se liลกรญ v tom, zda je velikost pevnฤ stanovenรก, jak funguje dolnรญ index a zda je lze uloลพit do databรกze.

Co je sbรญrka?
Kolekce je uspoลรกdanรก skupina prvkลฏ urฤitรฉho datovรฉho typu. Mลฏลพe se jednat o kolekci jednoduchรฉho datovรฉho typu nebo komplexnรญho datovรฉho typu, jako jsou uลพivatelsky definovanรฉ typy nebo typy zรกznamลฏ.
V kolekci je kaลพdรฝ prvek identifikovรกn termรญnem nazรฝvanรฝm "dolnรญ index." Kaลพdรฉ poloลพce je pลiลazen jedineฤnรฝ dolnรญ index a data lze manipulovat nebo naฤรญtat odkazem na tento jedineฤnรฝ dolnรญ index.
Kolekce jsou nejuลพiteฤnฤjลกรญ, kdyลพ je tลeba zpracovat nebo manipulovat s velkรฝm mnoลพstvรญm dat stejnรฉho typu. Kolekce lze naplnit a manipulovat s nimi jako 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:
- Indexovanรฉ tabulky (znรกmรฉ takรฉ jako asociativnรญ pole)
- Vnoลenรฉ tabulky
- Varrays
Data v kolekci lze kdykoli oznaฤit tลemi termรญny: nรกzvem kolekce, dolnรญm indexem a nรกzvem pole nebo sloupce, jako โ ( ). โO tฤchto kategoriรญch sbรญrek se dozvรญte v nรญลพe uvedenรฝch ฤรกstech.โ
Typy kolekcรญ v kostce
Tyto tลi typy kolekcรญ majรญ rลฏznรฉ kompromisy. Nรญลพe uvedenรก tabulka je srovnรกvรก, neลพ je kaลพdรฝ z nich podrobnฤji rozebere.
| Vzhled | Varray | Vnoลenรก tabulka | Indexovรกnรญ podle tabulky |
|---|---|---|---|
| Velikost | Pevnรก hornรญ hranice | Bez omezenรญ | Bez omezenรญ |
| Index | ฤรญselnรฝ | ฤรญselnรฝ | Celรฉ ฤรญslo nebo ลetฤzec |
| Hustota | Vลพdy hustรฝ | Hustรฉ nebo ลรญdkรฉ | Vลพdy ลรญdkรฉ |
| Uloลพeno v databรกzi | Ano | Ano | Ne |
| Vyลพaduje inicializaci | Ano | Ano | Ne |
Varrays
Varray je kolekce, ve kterรฉ je velikost pole pevnฤ danรก a nelze ji pลekroฤit. Dolnรญ index Varray je ฤรญselnรก hodnota. Atributy Varray jsou:
- Hornรญ limit velikosti je pevnฤ stanovenรฝ.
- Vyplลovรกno postupnฤ poฤรญnaje dolnรญm indexem '1'.
- Tento typ kolekce je vลพdy hustรฝ; nemลฏลพeme mazat jednotlivรฉ prvky pole. Varray lze smazat jako celek nebo oลรญznout od konce.
- Protoลพe je vลพdy hustรฝ, mรก velmi malou flexibilitu.
- Je vhodnฤjลกรญ, kdyลพ je znรกma velikost pole a podobnรฉ ฤinnosti se provedou na vลกech prvcรญch.
- Dolnรญ index a poฤet v kolekci zลฏstรกvajรญ vลพdy stabilnรญ.
- Pลed pouลพitรญm musรญ bรฝt inicializovรกna. Jakรกkoli operace kromฤ EXISTS na neinicializovanรฉ kolekci vyvolรก chybu.
- Mลฏลพe bรฝt vytvoลen jako databรกzovรฝ objekt viditelnรฝ v celรฉ databรกzi nebo uvnitล podprogramu pro pouลพitรญ pouze tam.
Obrรกzek nรญลพe vysvฤtluje alokaci pamฤti pro Varray (hustou).
| 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 typ_name deklarovรกn jako VARRAY typu 'DATA_TYPE' pro danรฝ limit velikosti. Datovรฝ typ mลฏลพe bรฝt buฤ jednoduchรฝ, nebo komplexnรญ.
Vnoลenรฉ tabulky
Vnoลenรก tabulka je kolekce, ve kterรฉ velikost pole nenรญ pevnฤ danรก. Mรก ฤรญselnรฝ typ dolnรญho indexu. Vรญce o typu vnoลenรฉ tabulky:
- Vnoลenรก tabulka nemรก hornรญ limit velikosti.
- Protoลพe hornรญ limit nenรญ pevnฤ stanovenรฝ, je nutnรฉ pamฤลฅ pลed kaลพdรฝm pouลพitรญm rozลกรญลit pomocรญ klรญฤovรฉho slova 'EXTEND'.
- Vyplลovรกno postupnฤ poฤรญnaje dolnรญm indexem '1'.
- Tento typ kolekce mลฏลพe bรฝt oba hustรฉ a ลรญdkรฉ; mลฏลพeme jej vytvoลit jako hustรฝ a takรฉ nรกhodnฤ mazat jednotlivรฉ prvky, ฤรญmลพ se stane ลรญdkรฝm.
- Poskytuje vฤtลกรญ flexibilitu pลi mazรกnรญ prvkลฏ pole.
- Je uloลพen v systรฉmem generovanรฉ databรกzovรฉ tabulce a lze jej pouลพรญt ve vรฝbฤrovรฉm dotazu k naฤtenรญ hodnot.
- Dolnรญ index a poฤet se mohou liลกit.
- Pลed pouลพitรญm musรญ bรฝt inicializovรกna. Jakรกkoli operace kromฤ EXISTS na neinicializovanรฉ kolekci vyvolรก chybu.
- Mลฏลพe bรฝt vytvoลen jako databรกzovรฝ objekt viditelnรฝ v celรฉ databรกzi nebo uvnitล podprogramu pro pouลพitรญ pouze tam.
Obrรกzek nรญลพe vysvฤtluje alokaci pamฤti vnoลenรฉ tabulky (hustรฉ a ลรญdkรฉ). Prรกzdnรฝ prostor elementu oznaฤuje ลรญdkรฝ element.
| 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 <type_name> IS TABLE OF <DATA_TYPE>;
- Ve vรฝลกe uvedenรฉ syntaxi je typ_name deklarovรกn jako vnoลenรก kolekce tabulek typu 'DATA_TYPE'. Datovรฝ typ mลฏลพe bรฝt buฤ jednoduchรฝ, nebo komplexnรญ.
Indexovรกnรญ podle tabulky
Indexovรก tabulka je kolekce, ve kterรฉ nenรญ velikost pole pevnฤ danรก. Na rozdรญl od jinรฝch typลฏ kolekcรญ mลฏลพe dolnรญ index indexovรฉ tabulky definovat uลพivatel. Atributy indexovรฉ tabulky jsou:
- Dolnรญ index mลฏลพe bรฝt celรฉ ฤรญslo nebo ลetฤzec. Typ dolnรญho indexu by mฤl bรฝt uveden pลi vytvรกลenรญ kolekce.
- 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. Jsou vytvรกลeny a pouลพรญvรกny v rรกmci konkrรฉtnรญ relace.
- Poskytujรญ vฤtลกรญ flexibilitu pลi udrลพovรกnรญ dolnรญho indexu.
- Dolnรญ indexy mohou bรฝt zรกpornou posloupnostรญ.
- Jsou vhodnฤjลกรญ pro relativnฤ menลกรญ hodnoty kolekcรญ pouลพรญvanรฉ v rรกmci stejnรฉho podprogramu.
- Pลed pouลพitรญm je nenรญ nutnรฉ inicializovat.
- Nelze je vytvoลit jako databรกzovรฝ objekt; vytvรกลejรญ se pouze uvnitล podprogramu.
- Funkce BULK COLLECT se s tรญmto typem kolekce nedรก pouลพรญt, protoลพe dolnรญ index musรญ bรฝt pro kaลพdรฝ zรกznam zadรกn explicitnฤ.
Obrรกzek nรญลพe vysvฤtluje alokaci pamฤti pro tabulku index-by (ลรญdkรฝ typ). Prรกzdnรฝ prostor pro element oznaฤuje ลรญdkรฝ element.
| Dolnรญ index (varchar) | PRVNร | DRUHร | TลETร | ฤTVRTร | PรTร | ล ESTร | SEDMร |
| Hodnota (ลรญdkรก) | Qwe | Asd | Afg | Asd | Wer |
Syntaxe pro tabulku s indexem:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Ve vรฝลกe uvedenรฉ syntaxi je typ_name deklarovรกn jako kolekce tabulek typu 'DATA_TYPE' ลazenรก po indexech. Promฤnnรก typu dolnรญ index je zadรกna jako typ VARCHAR2 s maximรกlnรญ velikostรญ 10.
Konstruktor a inicializaฤnรญ koncept v kolekcรญch
Konstruktory jsou vestavฤnรฉ funkce poskytovanรฉ Oracle kterรฉ majรญ stejnรฝ nรกzev jako objekt nebo kolekce. Jsou provedรกny jako prvnรญ, kdykoli je na objekt nebo kolekci poprvรฉ odkazovรกno v relaci. Dลฏleลพitรฉ podrobnosti o konstruktoru v kontextu kolekce:
- U kolekcรญ musรญ bรฝt tyto konstruktory volรกny explicitnฤ pro inicializaci kolekce.
- Jak tabulky typu Varray, tak vnoลenรฉ tabulky je nutnรฉ inicializovat pomocรญ tฤchto konstruktorลฏ, neลพ se na nฤ v programu odkรกลพe.
- Konstruktor implicitnฤ rozลกiลuje alokaci pamฤti pro kolekci (kromฤ Varray), takลพe mลฏลพe kolekci takรฉ pลiลazovat promฤnnรฉ.
- Pลiลazovรกnรญ hodnot pomocรญ konstruktorลฏ nikdy nezpลฏsobรญ ลรญdkรฝ stav kolekce.
Metody sbฤru
Oracle poskytuje mnoho funkcรญ pro manipulaci a prรกci s kolekcemi. Tyto funkce urฤujรญ a upravujรญ rลฏznรฉ atributy kolekce. Nรญลพe uvedenรก tabulka uvรกdรญ rลฏznรฉ funkce a jejich popisy.
| Metoda | Description | Syntax |
|---|---|---|
| EXISTUJE (n) | Vracรญ booleovskรฝ vรฝsledek. Vracรญ TRUE, pokud n-tรฝ prvek existuje, jinak FALSE. Na neinicializovanou kolekci lze pouลพรญt pouze 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 vracรญ pevnou velikost; pro vnoลenรฉ a indexovanรฉ tabulky vracรญ NULL. | .OMEZIT |
| PRVNร | Vrรกtรญ hodnotu prvnรญho dolnรญho indexu kolekce. | .PRVNร |
| LAST | Vrรกtรญ hodnotu poslednรญho dolnรญho indexu kolekce. | .POSLEDNร |
| PลEDCHOZร (n) | Vrรกtรญ pลedchozรญ dolnรญ index n-tรฉho prvku. Pokud ลพรกdnรฝ nenรญ, vrรกtรญ se NULL. | .PRIOR(n) |
| DALล ร (n) | Vrรกtรญ nรกsledujรญcรญ dolnรญ index n-tรฉho prvku. Pokud ลพรกdnรฝ nenรญ, vrรกtรญ se NULL. | .NEXT(n) |
| ROZล รลIT | Rozลกiลuje jeden prvek na konci kolekce. | .ROZล รลIT |
| PRODLOUลฝIT (n) | Rozลกiลuje n prvkลฏ na konci kolekce. | .EXTEND(n) |
| PRODLOUลฝIT (n,i) | Rozลกรญลรญ n kopiรญ i-tรฉho prvku 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 a vyprรกzdnรญ ji. | .VYMAZAT |
| DELETE (n) | Smaลพe n-tรฝ prvek. Pokud je n-tรฝ prvek NULL, neprovede se nic. | .DELETE(n) |
| ODSTRANIT (m, n) | Smaลพe prvky v rozsahu mth aลพ nth v kolekci. | .DELETE(m;n) |
Pลรญklad 1: Typ zรกznamu na รบrovni podprogramu
V tomto pลรญkladu uvidรญme, jak naplnit kolekci pomocรญ 'VELKร SBฤRโa jak odkazovat na data ze 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; /
Code Vysvฤtlenรญ
- Code ลรกdek 2โ8: Typ zรกznamu Promฤnnรก โemp_detโ je deklarovรกna se sloupci emp_no, emp_name, manager a salary datovรฉho typu NUMBER, VARCHAR2, NUMBER a NUMBER.
- Code ลรกdek 9: Vytvoลenรญ kolekce 'emp_det_tbl' z elementu typu zรกznamu 'emp_det'.
- Code ลรกdek 10: Deklarace promฤnnรฉ 'guru99_emp_rec' typu 'emp_det_tbl' a jejรญ inicializace konstruktorem s hodnotou null.
- Code ลรกdek 12โ15: Vloลพenรญ ukรกzkovรฝch dat do tabulky 'emp'.
- Code ลรกdek 16: Potvrzenรญ transakce vloลพenรญ.
- Code ลรกdek 17: Naฤรญtรกnรญ zรกznamลฏ z tabulky 'emp' a hromadnรฉ naplnฤnรญ promฤnnรฉ kolekce pomocรญ pลรญkazu โBULK COLLECTโ. Promฤnnรก 'guru99_emp_rec' nynรญ obsahuje vลกechny zรกznamy pลรญtomnรฉ v tabulce 'emp'.
- Code ลรกdek 19โ26: Nastavenรญ smyฤky 'FOR' pro tisk vลกech zรกznamลฏ v kolekci jeden po druhรฉm. Metody kolekce FIRST a LAST se pouลพรญvajรญ jako dolnรญ a hornรญ limity smyฤka.
Vรฝstup: Po spuลกtฤnรญ 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 ----------------------------------------------

