Pular para o conteúdo

Controle iterativo: Loop e instruções de repetição em PL/SQL

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

Diogo Alves

Diogo Alves

Diogo Alves, formado em Análise e Desenvolvimento de Sistemas, Pós Graduado em Engenharia de Software, é especialista em Banco de Dados Oracle com sólidos conhecimentos em SQL e PL/SQL; trabalha com Oracle há 8 anos, é certificado com OCE em SQL, OCA e OCP PL/SQL. Atualmente atua com desenvolvimento de aplicações PL/SQL no setor previdenciário do Estado de São Paulo, na empresa Atlantic Solutions, Localizada em Barueri/SP.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress