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.

  • ๐Ÿงบ Definice: Kolekce obsahuje mnoho prvkลฏ jednoho typu, kaลพdรฝ identifikovanรฝ jedineฤnรฝm dolnรญm indexem.
  • ๐Ÿ“ Varray: Pevnรก hornรญ velikost, vลพdy hustรก, ฤรญselnรฝ dolnรญ index, pล™ed pouลพitรญm musรญ bรฝt inicializovรกna.
  • ???? Vnoล™enรก tabulka: Bez omezenรญ velikosti, mลฏลพe bรฝt hustรฝ nebo ล™รญdkรฝ, uloลพen v systรฉmovรฉ tabulce, rozลกiล™itelnรฝ pomocรญ EXTEND.
  • ๐Ÿ”‘ Indexovรกnรญ podle tabulky: ลฝรกdnรฉ omezenรญ velikosti, dolnรญ index mลฏลพe bรฝt ล™etฤ›zec nebo zรกpornรฉ celรฉ ฤรญslo, neuklรกdรก se v databรกzi.
  • ๐Ÿ—๏ธ Stavitel: Varray a vnoล™enรฉ tabulky potล™ebujรญ explicitnรญ konstruktor pro inicializaci pล™ed odkazem.
  • ๐Ÿ› ๏ธ Metody: Funkce COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM a DELETE spravujรญ kolekci.
  • โšก Hromadnฤ›: HROMADNร SBฤšR naplnรญ kolekci v jednom kroku pro rychlรฉ zpracovรกnรญ.

Oracle Kolekce PL/SQL

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.โ€œ

Kolekce PL/SQL naplnฤ›nรก pล™รญkladem BULK COLLECT

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

Nejฤastฤ›jลกรญ dotazy

Varray mรก pevnou hornรญ velikost a je vลพdy hustรก. Vnoล™enรก tabulka nemรก ลพรกdnรฉ omezenรญ velikosti, mลฏลพe bรฝt ล™รญdkรก a lze ji rozลกiล™ovat, coลพ ji ฤinรญ flexibilnฤ›jลกรญ pro rostoucรญ nebo mezery v datech.

Protoลพe se jednรก o asociativnรญ pole v pamฤ›ti, nikoli o uloลพenou tabulku. Dolnรญ index funguje jako vyhledรกvacรญ klรญฤ, takลพe funguje ล™etฤ›zec nebo zรกpornรฉ celรฉ ฤรญslo, coลพ je uลพiteฤnรฉ pro vyhledรกvรกnรญ s klรญฤem v rรกmci relace.

Neinicializovanรก Varray nebo vnoล™enรก tabulka je atomicky null, takลพe odkazovรกnรญ na prvek vyvolรก chybu. Volรกnรญ konstruktoru jej alokuje, po kterรฉm EXTEND a pล™iล™azenรญ mohou pล™idรกvat data.

Ano. Vzhledem k tomu, zda je velikost pevnฤ› danรก, zda jsou data uloลพena a zda je potล™eba ล™etฤ›zcovรฝ klรญฤ, mลฏลพe umฤ›lรก inteligence ukรกzat na Varray, vnoล™enou tabulku nebo tabulku index-by a vysvฤ›tlit kompromis.

HROMADNร SBฤšR naฤรญtรก vลกechny ล™รกdky do kolekce v jedinรฉm pล™epnutรญ kontextu mezi enginy SQL a PL/SQL, namรญsto jednoho pล™epnutรญ na ล™รกdek, coลพ vรฝraznฤ› sniลพuje reลพijnรญ nรกklady na velkรฉ sady vรฝsledkลฏ.

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