Нека започнем с вложените таблици, те са най-често срещаната форма на колекция и затова представляват полезна база за сравнение.
Вложената таблица е променлива, която може да съдържа повече от един екземпляр на нещо, често запис от таблица на база данни. Те могат да бъдат декларирани по следния начин:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
Те са полезни винаги, когато искаме да съхраняваме множество екземпляри от данни, спрямо които искаме да направим едно и също нещо. Класическият пример е използването на BULK COLLECT за съхраняване на множество записи:
select *
bulk collect into emp_rec_nt
from employees;
Това ни дава източник на данни, които можем да обикаляме; най-важното е, че можем да се движим назад, както и напред, дори да прескачаме до края или началото, което не можем да правим с курсора. Вложените таблици могат да бъдат колекции от всякакъв тип данни, включително композитни като PL/SQL записи или потребителски дефинирани типове.
Таблица Index By е по-добре да се нарича (както правят документите) Асоциативен масив. Това са прости колекции от единични атрибути с индекс. Вложените таблици също имат индекси, но техните индекси са само броя на редовете. С асоциативен масив индексът може да бъде смислен, т.е. извлечен от стойност на данни. Така че те са полезни за кеширане на стойности на данни за по-късна употреба. Индексът може да бъде число или (от 9iR2) низ, което може да бъде много полезно. Например, ето асоциативен масив от заплати, който се индексира от идентификатора на служителя.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Обърнете внимание, че можех да декларирам този масив с помощта на INDEX BY BINARY_INTEGER, но е по-ясно да използвам синтаксиса %TYPE вместо това (самодокументиращ код). Елементите от този масив могат да бъдат идентифицирани чрез стойност на индекс, в този случай EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
Освен кеширане на референтни таблици или подобни стойности за търсене, няма много случаи на употреба за асоциативни масиви.
Масивите с променливи са просто вложени таблици с предварително дефинирано ограничение за броя на елементите. Така че може би името е подвеждащо:те всъщност са фиксирани масиви. Има малко, което можем да направим с VArrays, което не можем да направим с вложени таблици (освен да ограничим броя на елементите и е доста рядко да искаме да направим това). Те се декларират по следния начин:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
Можем да използваме групово събиране, за да попълним VArray ...
select *
bulk collect into emp_rec_va
from employees;
Трябва обаче да сме сигурни, че заявката ще върне най-много броя на елементите, посочени в декларацията на VArray. В противен случай SELECT ще хвърли ORA-22165.
Няма известни случаи на употреба за променливи масиви. Добре, това е малко грубо, но почти през цялото време вместо това ще използвате вложени таблици. Едно голямо предимство на VArrays пред вложените таблици е, че те гарантират реда на елементите. Така че, ако трябва да извадите елементи в същия ред, в който сте ги вмъкнали, използвайте VArray.
PL/SQL документацията посвещава цяла глава на колекциите. Научете повече.