← Voltar ao Blog

Otimizando Consultas em Massa com BULK COLLECT, LIMIT e Tratamento de Exceções

Publicado em: 11/07/2026 09:40 PL/SQL

O Perigo do Consumo Excessivo de Memória PGA

Como vimos anteriormente, o comando BULK COLLECT é uma ferramenta poderosa para eliminar o gargalo de trocas de contexto (Context Switching) entre os motores PL/SQL e SQL, carregando coleções inteiras de dados de uma só vez. No entanto, coletar dezenas ou centenas de milhões de registros em uma única operação sem controles adequados pode esgotar rapidamente a memória PGA (Program Global Area) alocada para a sua sessão no servidor de banco de dados, resultando em erros graves de falta de memória ou lentidão sistêmica.

Para mitigar esse risco em rotinas de processamento em lote (Batch Processing) de grande escala, a Oracle disponibiliza a cláusula LIMIT combinada com o consumo iterativo de cursores.

Controlando o Consumo de Memória com a Cláusula LIMIT

A cláusula LIMIT restringe o número máximo de linhas que o comando BULK COLLECT carrega para dentro da coleção a cada iteração do loop. Dessa forma, o processamento ocorre em blocos controlados (por exemplo, lotes de 5.000 ou 10.000 registros por vez), garantindo estabilidade e liberação contínua de recursos em memória.

Exemplo prático de processamento em lotes controlados:

DECLARE  CURSOR c_transacoes IS    SELECT transaction_id, account_id, amount    FROM transactions    WHERE status = 'PENDING';  TYPE t_trans_list IS TABLE OF c_transacoes%ROWTYPE;  l_lote_transacoes t_trans_list;    -- Definindo o tamanho ideal do lote  c_tamanho_lote CONSTANT PLS_INTEGER := 5000; BEGIN  OPEN c_transacoes;  LOOP    -- Carrega apenas 5 mil registros por vez    FETCH c_transacoes BULK COLLECT INTO l_lote_transacoes LIMIT c_tamanho_lote;    EXIT WHEN l_lote_transacoes.COUNT = 0;    -- Processa o lote atual em memória    FOR i IN 1..l_lote_transacoes.COUNT LOOP        -- Lógica de negócio aplicada em cada registro do lote        NULL; -- Substituir pela regra real    END LOOP;    -- Opcional: efetivar commit parcial por lote se a arquitetura permitir    COMMIT;  END LOOP;  CLOSE c_transacoes; END;

Tratamento de Erros Parciais em Lote com SAVE EXCEPTIONS

Outro grande desafio ao processar grandes volumes de dados via FORALL é garantir que uma falha isolada em um único registro (como a violação de uma chave única ou restrição de nulo) não derrube a execução inteira do lote.

Utilizando a cláusula SAVE EXCEPTIONS, o motor PL/SQL continua executando as demais operações do array e armazena os erros ocorridos na pilha de exceções SQL%BULK_EXCEPTIONS para auditoria posterior.

Boas Práticas para Rotinas Batch em Produção

Conclusão

Dominar o uso combinado de BULK COLLECT com LIMIT e o tratamento de falhas via SAVE EXCEPTIONS capacita o desenvolvedor a escrever rotinas PL/SQL robustas, seguras e altamente performáticas para ambientes corporativos de missão crítica.