Vamos começar com as tabelas aninhadas, elas são a forma mais comum de coleta e, portanto, representam uma base útil de comparação.
Uma tabela aninhada é uma variável que pode conter mais de uma instância de algo, geralmente um registro de uma tabela de banco de dados. Eles podem ser declarados assim:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
Eles são úteis sempre que queremos armazenar várias instâncias de dados em relação aos quais queremos fazer a mesma coisa. O exemplo clássico é usar BULK COLLECT para armazenar vários registros:
select *
bulk collect into emp_rec_nt
from employees;
Isso nos dá uma fonte de dados que podemos fazer um loop; crucialmente, podemos navegar para trás e para frente, até mesmo pular para o final ou para o início, coisas que não podemos fazer com um cursor. As tabelas aninhadas podem ser coleções de qualquer tipo de dados, incluindo compostos como registros PL/SQL ou tipos definidos pelo usuário.
Uma tabela Index By é melhor chamada (como os documentos fazem) de Associative Array . Estas são coleções simples de atributos únicos com um índice. As tabelas aninhadas também têm índices, mas seus índices são apenas contagens de linhas. Com uma matriz associativa, o índice pode ser significativo, ou seja, originado de um valor de dados. Portanto, eles são úteis para armazenar em cache valores de dados para uso posterior. O índice pode ser um número, ou (desde 9iR2) uma string que pode ser muito útil. Por exemplo, aqui está uma matriz associativa de salários que é indexada pelo identificador do funcionário.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Observe que eu poderia ter declarado esse array usando INDEX BY BINARY_INTEGER, mas é mais claro usar a sintaxe %TYPE (código autodocumentado). Os elementos desse array podem ser identificados por um valor de índice, neste caso EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
Além de armazenar em cache tabelas de referência ou valores de pesquisa semelhantes, não há muitos casos de uso para matrizes associativas.
Arrays de variáveis são apenas tabelas aninhadas com um limite pré-definido no número de elementos. Então, talvez o nome seja enganoso:eles são na verdade arrays fixos. Há pouco que podemos fazer com VArrays que não podemos fazer com tabelas aninhadas (exceto restringir o número de elementos e é muito raro que queiramos fazer isso). Eles são declarados assim:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
Podemos usar a coleta em massa para preencher um VArray ...
select *
bulk collect into emp_rec_va
from employees;
No entanto, devemos ter certeza de que a consulta retornará no máximo o número de elementos especificados na declaração do VArray. Caso contrário, o SELECT lançará ORA-22165.
Não há casos de uso conhecidos para arrays de variáveis. Ok, isso é um pouco duro, mas quase sempre você usará tabelas aninhadas. A grande vantagem dos VArrays sobre as tabelas aninhadas é que eles garantem a ordem dos elementos. Portanto, se você precisar obter elementos na mesma ordem em que os inseriu, use um VArray.
A documentação PL/SQL dedica um capítulo inteiro às coleções. Descubra mais.