Zacznijmy od tabel zagnieżdżonych, są one najczęstszą formą gromadzenia i stanowią użyteczną podstawę porównawczą.
Zagnieżdżona tabela to zmienna, która może przechowywać więcej niż jedną instancję czegoś, często rekord z tabeli bazy danych. Można je zadeklarować w ten sposób:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
Są przydatne, gdy chcemy przechowywać wiele wystąpień danych, w stosunku do których chcemy zrobić to samo. Klasycznym przykładem jest użycie BULK COLLECT do przechowywania wielu rekordów:
select *
bulk collect into emp_rec_nt
from employees;
Daje nam to źródło danych, które możemy zapętlić; co najważniejsze, możemy nawigować zarówno do tyłu, jak i do przodu, a nawet przejść do końca lub początku, czego nie możemy zrobić za pomocą kursora. Tabele zagnieżdżone mogą być zbiorami dowolnego typu danych, w tym złożonymi, takimi jak rekordy PL/SQL lub typy zdefiniowane przez użytkownika.
Tabela Index By jest lepiej nazywana (jak to robi dokumentacja) tablicą asocjacyjną . Są to proste kolekcje pojedynczych atrybutów z indeksem. Tabele zagnieżdżone również mają indeksy, ale ich indeksy to tylko liczniki wierszy. W przypadku tablicy asocjacyjnej indeks może mieć znaczenie, tj. pochodzić z wartości danych. Są więc przydatne do buforowania wartości danych do późniejszego wykorzystania. Indeks może być liczbą lub (od 9iR2) ciągiem, który może być bardzo przydatny. Na przykład, oto tablica asocjacyjna wynagrodzeń, która jest indeksowana przez identyfikator pracownika.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Zauważ, że mogłem zadeklarować tę tablicę za pomocą INDEX BY BINARY_INTEGER, ale wyraźniej jest użyć składni %TYPE (kod samodokumentujący). Elementy tej tablicy można zidentyfikować za pomocą wartości indeksu, w tym przypadku EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
Poza buforowaniem tabel referencyjnych lub podobnych wartości wyszukiwania, nie ma wielu przypadków użycia tablic asocjacyjnych.
Tablice zmiennych to po prostu zagnieżdżone tabele z predefiniowanym limitem liczby elementów. Być może nazwa jest myląca:w rzeczywistości są to tablice stałe. Niewiele możemy zrobić z VArrays, czego nie możemy zrobić z zagnieżdżonymi tabelami (poza ograniczeniem liczby elementów, a jest to dość rzadkie, że chcielibyśmy to zrobić). Są one deklarowane w następujący sposób:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
Możemy użyć zbierania zbiorczego do wypełnienia VArray...
select *
bulk collect into emp_rec_va
from employees;
Musimy jednak mieć pewność, że zapytanie zwróci co najwyżej liczba elementów określona w deklaracji VArray. W przeciwnym razie SELECT rzuci ORA-22165.
Nie są znane przypadki użycia tablic zmiennych. Ok, to trochę trudne, ale prawie przez cały czas będziesz używać tabel zagnieżdżonych. Jedną wielką zaletą VArrays nad tabelami zagnieżdżonymi jest to, że gwarantują kolejność elementów. Więc jeśli musisz wyciągnąć elementy w tej samej kolejności, w jakiej je wstawiłeś, użyj VArray.
Dokumentacja PL/SQL poświęca cały rozdział kolekcjom. Dowiedz się więcej.