Processamento de dados em massa usando a declaração FORALL
Eu sei que o tutorial anterior foi uma pausa rápida da nossa série de coleta em massa. Afinal era o que o público exigia e tínhamos a obrigação de cumprir. Mas não se preocupe, estamos de volta aos trilhos. Então, vamos ver a introdução ao processamento de dados em massa usando a instrução FORALL no banco de dados Oracle.
Caso você não saiba de qual tutorial estou falando, confira aqui. Então agora vamos ao assunto.
O que é uma declaração FORALL?
A instrução FORALL ajuda a processar dados em massa de maneira otimizada enviando instruções DML ou uma instrução MERGE (se você estiver usando 11g ou superior) em lotes do mecanismo PL/SQL para o mecanismo SQL.
Você também pode definir uma instrução FORALL como uma construção de loop em massa que executa uma instrução DML ou uma instrução MERGE uma vez ou várias vezes ao mesmo tempo.
A coleta em massa otimiza a consulta e aumenta o desempenho reduzindo as trocas de contexto. FORALL faz a mesma coisa para instruções DML como Insert, Delete, Update ou para uma instrução MERGE.
Qual é a sintaxe da instrução FORALL?
A sintaxe é bem simples, vamos dar uma olhada.
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
Onde:
FORALL é a palavra-chave reservada da Oracle.
Índice é um contador de loop definido implicitamente que é declarado pelo mecanismo PL/SQL como PLS_INTEGER. Como é definido implicitamente pelo mecanismo PL/SQL, você não precisa defini-lo. O escopo do Index é limitado à instrução FORALL na qual ele é definido.
Bound_Clauses são as cláusulas que controlam o número de iterações do loop. Além disso, o valor do índice também depende dele. Existem três tipos de cláusulas vinculadas no Oracle PL/SQL que discutiremos separadamente mais adiante neste tutorial.
SALVAR EXCEÇÃO é uma opção opcional que mantém a instrução FORALL em execução mesmo quando a instrução DML causa uma exceção. Essas exceções são salvas em um atributo de cursor chamado SQL%Bulk_Exceptions.
Informações:
Devido a SAVE EXCEPTION, a instrução FORALL não sai abruptamente, mesmo quando há uma exceção. Esta é uma vantagem da instrução FORALL sobre o Loop FOR.
Declaração DML :A instrução DML pode ser qualquer instrução DML como INSERT, UPDATE ou DELETE. Se você estiver usando o Oracle 11g ou superior, também poderá usar a instrução MERGE com FORALL. Mas você precisa ter certeza de que sua instrução DML ou a instrução MERGE deve fazer referência a pelo menos uma coleção em sua cláusula VALUES ou WHERE.
Além disso, ao contrário do FOR Loop, com a instrução FORALL, podemos usar apenas uma DML por vez. Este é o defeito do FORALL.
O FORALL é um loop como o FOR Loop?
Não, embora a instrução FORALL itere por todas as linhas de uma coleção, mas não é um loop FOR. Se você viu a sintaxe com atenção, deve ter notado que, diferentemente de ‘FOR Loop’, o bloco da instrução FORALL não começa com a palavra-chave LOOP nem termina com a palavra-chave END LOOP.
Podemos executar Inserir e Atualizar DML de uma vez usando FORALL?
Não, infelizmente Ao contrário do FOR Loop com FORALL, não podemos executar mais de um DML por vez. Isso significa que você pode executar Insert ou Update ao mesmo tempo, não os dois juntos. Essa é uma falha da instrução FORALL.
O que é atributo de cursor SQL%Bulk_Exceptions?
O atributo cursor SQL%Bulk_Exceptions é uma coleção de registros que possui dois campos Error_Index e Error_Code. Error_Index armazena o número de iterações da instrução FORALL em que ocorreu a exceção. Por outro lado, Error_Code armazena o código de exceção que corresponde à exceção levantada.
Podemos ver o número de exceções que ocorreram durante a execução da instrução FORALL?
Você pode verificar facilmente quantas exceções foram levantadas durante a execução da instrução FORALL usando SQL%BULK_EXCEPTION.COUNT.
Quais são essas cláusulas vinculadas? Conte-nos algo sobre eles.
Como mencionado acima, as cláusulas Bound controlam o valor do índice do loop e o número de iterações da instrução FORALL. Existem três tipos de cláusulas vinculadas que podem ser usadas com a instrução FORALL no Oracle Database. Esses são:
- Limite inferior e superior
- Índices de e
- Valores de
O limite INFERIOR E SUPERIOR :Semelhante ao FOR LOOP, nesta cláusula vinculada, você deve especificar o início e o fim válidos dos números de índice consecutivos da coleção referenciada.
É obrigatório especificar um intervalo válido de números de índice consecutivos junto com esta cláusula vinculada para o número de coleções referenciadas na instrução DML. No entanto, existe uma chance de erro se a coleção referenciada com esta cláusula for considerada esparsa. O erro que você terá é este:
ORA-22160: element at index [3] does not exist
Caso sua coleção referenciada seja esparsa e você esteja usando o Oracle 10g ou superior, talvez queira usar as outras duas opções, que são 'Indices-of' e 'Values-of'.
Os ÍNDICES DE :A segunda cláusula vinculada que está disponível para nós é 'Indices of'. Essa cláusula vinculada permite que nossa instrução FORALL percorra uma coleção esparsa, como uma matriz associativa ou uma tabela aninhada.
Leitura sugerida:Introdução à coleção PL/SQL
Os VALORES DE :A terceira cláusula vinculada é Values of. A opção VALUES OF deixa claro que os valores dos elementos da coleção especificada do contador de loops são a base dos valores na instrução FORALL. Basicamente, essa coleção é um grupo de índices que a instrução FORALL pode percorrer. Além disso, esses índices não precisam ser únicos e podem ser listados em uma ordem arbitrária.
Caso você aprenda mais rápido assistindo ao tutorial em vídeo, aqui está uma instrução FORALL explicativa em detalhes.
Estaremos aprendendo a usar todas essas cláusulas vinculadas com a instrução FORALL nos tutoriais futuros, portanto, fique atento. Para atualizações mais recentes, você pode se inscrever no meu canal do YouTube e me seguir nas minhas redes sociais.
Obrigado e tenha um ótimo dia!