Armazenando e Manipulando Conjuntos de Dados em Memória
Em rotinas complexas de banco de dados, frequentemente precisamos armazenar temporariamente conjuntos de registros ou listas de valores em memória para processamento procedural, validação de regras de negócio ou manipulação em lote antes de persistir os dados definitivamente nas tabelas físicas. Para atender a essa necessidade, o PL/SQL disponibiliza estruturas de dados compostas conhecidas como Coleções.
Neste artigo, detalharemos os três tipos de coleções suportados pelo PL/SQL e quando utilizar cada um deles para maximizar a performance das suas procedures e packages.
Os Três Tipos de Coleções em PL/SQL
O ecossistema PL/SQL oferece três estruturas distintas de coleções, cada uma com características próprias de indexação, tamanho e persistência:
- Associative Arrays (Index-by Tables): Coleções flexíveis indexadas por números inteiros ou por strings (caracteres). Não possuem limite pré-definido de tamanho e podem crescer de forma dinâmica. São ideais para buscas rápidas baseadas em chave-valor em memória.
- Nested Tables (Tabelas Aninhadas): Coleções unidimensionais sem limite fixo de tamanho inicial. Podem ser esparsas (permitindo excluir elementos do meio e deixar lacunas nos índices) e podem inclusive ser armazenadas diretamente em colunas de tabelas relacionais do banco.
- VARRAYs (Variable-Size Arrays): Arrays de tamanho estático máximo previamente definido no momento da declaração. Garantem que a ordem dos elementos seja rigorosamente mantida e são ideais para conjuntos de dados cujo tamanho máximo é conhecido de antemónio.
Exemplo prático de declaração e uso de um Associative Array:

Métodos Nativos de Manipulação (Collection Methods)
O PL/SQL fornece funções e procedimentos embutidos (métodos) extremamente úteis para inspecionar e manipular o estado das coleções em tempo de execução:
- EXISTS(n): Retorna TRUE se o elemento na posição ou chave n existir na coleção.
- COUNT: Retorna o número total de elementos atualmente armazenados na coleção.
- FIRST e LAST: Retornam, respectivamente, o primeiro e o último índice ou chave da coleção.
- EXTEND: Adiciona elementos vazios ao final de uma Nested Table ou VARRAY (obrigatório antes de popular coleções que não são index-by).
- DELETE: Remove elementos de uma coleção (em Nested Tables, pode remover um intervalo específico de índices).
Exemplo prático populando uma Nested Table com EXTEND:

Boas Práticas de Performance
- Prefira Associative Arrays para processamentos locais rápidos: Se você precisa apenas de um dicionário em memória dentro da procedure para cruzar dados sem persistir em tabelas, os associative arrays indexados por inteiros oferecem excelente performance.
- Cuidado com o consumo de PGA: Assim como no BULK COLLECT, evite carregar coleções massivas com centenas de milhares de linhas desnecessariamente em memória procedural para não impactar a PGA da sessão.
Conclusão
Dominar o uso de coleções e arrays em PL/SQL capacita o desenvolvedor a estruturar algoritmos procedurais complexos, limpos e altamente eficientes diretamente na camada de banco de dados.