Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Objetivo de usar diferentes tipos de coleções PL/SQL no Oracle


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.