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.
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.
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;
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.

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.