Controle iterativo: Instrução LOOP
Loop repete uma instrução ou uma sequência de instruções muitas vezes.
A linguagem de programação PL/SQL nos fornece os seguintes tipos de Loops:
- Básico (ou Infinito) Loop que realizam ações repetitivas sem condições gerais.
- For Loop que realizam iterativas ações baseado em um contador.
- While Loop que realizam ações repetitivas baseado em uma condição.
Básico Loop
A forma mais simples de uma instrução Loop é o básico (ou infinito) Loop, que agrega instruções entre as palavras-chaves LOOP e END LOOP. Este tipo de loop é usado quando a sequencia de instruções deve ser executada ao menos uma vez.
Para cada vez que o fluxo de execução alcança a palavra chave END LOOP, o controle é retornado para a correspondente instrução LOOP acima. O básico loop permite a execução das instruções, pelo menos uma vez até que o fluxo de execução alcance uma palavra chave EXIT. Sem a palavra chave EXIT o loop seria infinito.
Podemos utilizar o seguinte comando:
LOOP
Sequência de instruções
END LOOP;
A instrução EXIT
Você pode usar a instrução EXIT para terminar um fluxo de execução Loop. O controle passa para próxima instrução depois do END LOOP. Podemos usar a instrução EXIT dentro de uma instrução IF ou uma declaração autônoma dentro do LOOP.
Exemplo 01:
LOOP
...
IF v_qtd_produto < 3 THEN
...
EXIT; -- sai imediatamente do loop
END IF;
END LOOP;
— controle é direcionado até aqui
Exemplo 02:
LOOP
Sequência de instruções
EXIT [WHEN Condição]
END LOOP;
Recomendações para o uso do EXIT
- A instrução EXIT deve ser declarada entre as palavras chave LOOP e END LOOP;
- Se a instrução EXIT está declarada logo após a palavra chave LOOP, todas as instruções após o EXIT não serão executadas e o controle de execução será direcionado para próxima instrução após o END LOOP;
- Um básico loop pode conter muitas instruções EXIT, mas é recomendável ter somente um ponto de EXIT;
A instrução EXIT WHEN
A palavra chave WHEN que podemos notar no exemplo 02, pode ser usada para sair do LOOP condicionalmente. Quando a instrução EXIT é alcançada, a condição do WHEN é avaliada. Se a condição for verdadeira o controle de execução será direcionado para próxima instrução após o END LOOP.
Com a breve descrição acima concluímos o assunto sobre básico loop.
For Loop
O for loop tem a mesma estrutura geral que o básico loop. Com um adicional, uma instrução de controle de número de iterações antes da palavra chave LOOP.
Geralmente usamos o For Loop quando sabemos o numero de iterações e limitamos com o uso do controle de iterações. Com isso o controle de execução sai do laço ao fim do intervalo, sem a necessidade da instrução EXIT.
Podemos utilizar o seguinte comando:
FOR contador IN [REVERSE] limite_inferior..limite_superior LOOP
Sequência de instruções
END LOOP;
- Podemos usar a instrução FOR LOOP para teste simples de um determinado numero de iteração.
- Não precisamos declarar o “contador” ele é declarado implicitamente como um inteiro.
- O limite inferior e superior não é opcional para instrução FOR LOOP.
- A palavra chave REVERSE muda a posição do limite inferior e superior passando a trabalhar ao reverso do superior para o inferior.
A sequência de instruções é executada, a cada vez que o contador é incrementado, tal como determinado pelos dois limites. O limite inferior e limite superior, este intervalo pode ser literais, variáveis ou expressões, mas deve ser validada para inteiros. Os limites são arredondados para números inteiros, ou seja, 03/11 ou 05*08 são limites superiores ou inferiores válidos.
Se o limite inferior do intervalo do loop seja avaliado como um número inteiro maior do que o limite superior, então a sequência de instruções não é executada.
A seguinte instrução é executada apenas uma vez:
FOR i IN 5..5 LOOP
Sequência de instruções
END LOOP;
Recomendações para o uso do FOR LOOP
- A declaração “contador” é implicitamente declarada e somente referenciada apenas dentro do laço, a declaração é indefinida fora do FOR LOOP;
- Não podemos referenciar o “contador” como o destino de uma atribuição;
- O limite inferior e superior do FOR LOOP não pode ser nulo;
- Como no básico loop usamos a instrução EXIT para sair, podemos também usar para o FOR LOOP interrompendo assim o intervalo de iteração;
Com a breve descrição acima concluímos o assunto sobre For Loop, sabendo que temos muito a aprender sobre iterações; intervalos dinâmicos; regras de escopo; etc.
While Loop
O while loop tem a mesma estrutura geral que o básico loop. Com um adicional, uma instrução de WHILE condicional.
Você pode usar o WHILE Loop para repetir a sequência de instruções até que o controle condicional não seja mais verdadeiro. A condição é avaliada a cada inicio de iteração. O loop termina quando a condição passa a ser falsa ou nula. Se a condição for falsa ou nula o controle de execução será direcionado para próxima instrução após o END LOOP.
Podemos utilizar o seguinte comando:
WHILE condição LOOP
Sequência de instruções
END LOOP;
- A “condição” pode ser uma variável boolean ou uma expressão (TRUE, FALSE ou NULL).
- A sequência de instruções pode ser uma ou mais instruções SQL ou PL/SQL.
- Se a variável envolvida na condição não mudar no corpo do LOOP então a condição será sempre verdadeira e será um loop infinito.
O numero de iterações depende da condição e é desconhecido até o Loop se completar. A condição é avaliada no topo do LOOP, então a sequência de instruções poderá ser executada zero vez.
Em algumas linguagens de programação temos uma estrutura de laço “LOOP UNTIL” ou “REPEAT UNTIL”, que avalia a condição na parte inferior do laço e não no topo. Portanto a sequência de instruções é executada ao menos uma vez. PL/SQL não tem este tipo de estrutura, mas podemos facilmente construir uma, segue exemplo:
LOOP
Sequência de instruções
EXIT WHEN expressão_boolean;
END LOOP;
Mais um exemplo para garantir que as instruções serão executadas ao menos uma vez pode inicializar a variável boolean da condição, como abaixo:
done := FALSE;
WHILE NOT done LOOP
Sequência de instruções
done := expressão_boolean;
END LOOP;
Quanto Usar Cada Tipo de Loop
Básico Loop
Use um básico loop quando a instrução dentro do loop deve ser executada ao menos uma vez.
FOR Loop
Use um for loop se o numero de iterações é conhecido.
WHILE Loop
Use um while loop se a condição deve ser avaliada a cada inicio de iteração.
Referências
Enjoy