Začněme s vnořenými tabulkami, jsou nejběžnější formou sběru dat, a proto představují užitečný základ pro srovnání.
Vnořená tabulka je proměnná, která může obsahovat více než jednu instanci něčeho, často záznam z databázové tabulky. Mohou být deklarovány takto:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
Jsou užitečné, kdykoli chceme uložit více instancí dat, se kterými chceme dělat totéž. Klasickým příkladem je použití BULK COLLECT k uložení více záznamů:
select *
bulk collect into emp_rec_nt
from employees;
To nám dává zdroj dat, která můžeme zacyklit; zásadní je, že se můžeme pohybovat dozadu i dopředu, dokonce i přeskočit na konec nebo začátek, což jsou věci, které s kurzorem dělat nemůžeme. Vnořené tabulky mohou být kolekce libovolného datového typu, včetně složených, jako jsou záznamy PL/SQL nebo uživatelem definované typy.
Tabulce Index By se lépe říká (jak to dělají dokumenty) Associative Array . Jedná se o jednoduché kolekce jednotlivých atributů s indexem. Vnořené tabulky mají také indexy, ale jejich indexy jsou pouze počty řádků. S asociativním polem může být index smysluplný, tj. pocházet z datové hodnoty. Jsou tedy užitečné pro ukládání datových hodnot do mezipaměti pro pozdější použití. Index může být číslo nebo (od 9iR2) řetězec, což může být velmi užitečné. Zde je například asociativní pole platů, které je indexováno podle identifikátoru zaměstnance.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Všimněte si, že jsem mohl deklarovat toto pole pomocí INDEX BY BINARY_INTEGER, ale je jasnější místo toho použít syntaxi %TYPE (samodokumentující kód). Prvky tohoto pole lze identifikovat podle hodnoty indexu, v tomto případě EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
Kromě ukládání referenčních tabulek do mezipaměti nebo podobných vyhledávacích hodnot neexistuje mnoho případů použití pro asociativní pole.
Pole proměnných jsou pouze vnořené tabulky s předem definovaným limitem počtu prvků. Možná je tedy název zavádějící:ve skutečnosti jde o pevná pole. S VArrays můžeme dělat jen málo, což nemůžeme dělat s vnořenými tabulkami (kromě omezení počtu prvků a je velmi vzácné, že bychom to chtěli dělat). Jsou deklarovány takto:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
K naplnění VArray můžeme použít hromadné shromažďování ...
select *
bulk collect into emp_rec_va
from employees;
Musíme si však být jisti, že dotaz vrátí nejvýše počet prvků specifikovaných v deklaraci VArray. Jinak SELECT vrhne ORA-22165.
Nejsou známy žádné případy použití pro variabilní pole. Dobře, je to trochu drsné, ale téměř po celou dobu budete místo toho používat vnořené tabulky. Jedna velká výhoda VArrays oproti vnořeným tabulkám je, že zaručují pořadí prvků. Pokud tedy musíte prvky dostat ven ve stejném pořadí, v jakém jste je vložili, použijte VArray.
Dokumentace PL/SQL věnuje kolekci celou kapitolu. Zjistěte více.