Oracle LOOP PL/SQL com exemplo

O que são laços?

Loops permitem que uma determinada parte do código de um programa seja executada pelo número desejado de vezes.

Neste tutorial, veremos o conceito de loop em PL/SQL e o fluxo de controle em loops.

Introdução ao conceito de Loops

O conceito de loops oferece a seguinte vantagem na codificação.

  • Reutilização do código
  • Tamanho de código reduzido
  • Fácil fluxo de controle
  • Complexidade reduzida

O diagrama abaixo mostra o conceito de loop de forma pictórica

Oracle LOOP PL/SQL

No diagrama acima, a condição do loop será verificada e, enquanto a condição do loop for satisfeita, o bloco de execução será executado.

Em cada iteração, a variável do contador de loop que realmente decide a condição do loop deve ser modificada para fazer o controle sair do loop. Em alguns casos, esta variável contadora de loop é um operador de incremento/decremento para uma contagem predefinida e, em alguns casos, é uma condição de pesquisa que continua executando o bloco até satisfazê-lo.

Declarações de controle de loop

Antes de aprender o conceito de loops, é obrigatório aprender sobre instruções de controle de loop. Instruções de controle de loop são aquelas que realmente controlam o fluxo de execução dentro do loop. Abaixo está a descrição detalhada sobre as instruções de controle de loop.

CONTINUAR

Esta palavra-chave envia uma instrução para o mecanismo PL/SQL que sempre que o mecanismo PL/SQL encontrar esta palavra-chave dentro do loop, ele irá pular o código restante no bloco de execução do código e a próxima iteração começará imediatamente. Isso será usado principalmente se o código dentro do loop quiser ser ignorado para determinados valores de iteração.

SAIR / SAIR QUANDO

Esta palavra-chave envia uma instrução ao mecanismo PL/SQL de que sempre que o mecanismo PL/SQL encontrar essa palavra-chave, ele sairá imediatamente do loop atual. Se o mecanismo PL/SQL encontrar EXIT em um loop aninhado, então ele sairá do loop em que foi definido, ou seja, em loops aninhados, fornecer EXIT no loop interno apenas sairá do controle do loop interno, mas não do loop externo. 'EXIT WHEN' é seguido por uma expressão que fornece um resultado booleano. Se o resultado for TRUE, o controle sairá.

GOTO

Esta instrução transferirá o controle para a instrução rotulada (“GOTO ;”). Isto tem as seguintes restrições

  • A transferência de controle só pode ser feita dentro dos subprogramas.
  • A transferência de controle não pode ser feita da parte de tratamento de exceções para a parte de execução

O uso desta declaração não é recomendado a menos que não haja outras alternativas, pois a rastreabilidade do código-controle será muito difícil no programa devido à transferência de controle de uma parte para outra.

Tipos de loop em PL/SQL

PL/SQL fornece os seguintes três tipos de loops

Declaração de Loop Básico

Esta instrução de loop é a estrutura de loop mais simples em PL/SQL. O bloco de execução começa com a palavra-chave 'LOOP' e termina com a palavra-chave 'END LOOP'.

A condição de saída deve ser dada dentro deste bloco de execução para que o controle saia do loop.

É necessário que a palavra-chave EXIT seja fornecida explicitamente na parte de execução para sair do loop.

Declaração de Loop Básico

 LOOP
<execution block starts>
<EXIT condition based on developer criteria> 
<execution_block_ends>
END LOOP;

Explicação da sintaxe:

  • Na sintaxe acima, a palavra-chave 'LOOP' marca o início do loop e 'END LOOP' marca o fim do loop.
  • O bloco de execução contém todo o código que precisa ser executado, incluindo a condição EXIT.
  • A parte de execução pode conter qualquer instrução de execução.

Nota: A instrução de loop básico sem palavra-chave EXIT será um INFINITE-LOOP que nunca irá parar.

Exemplo 1: Neste exemplo, vamos imprimir números de 1 a 5 usando a instrução de loop básica. Para isso, executaremos o seguinte código.

Declaração de Loop Básico

DECLARE 
a NUMBER:=1; 
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/

Explicação do código:

  • Linha de código 2: Declarar a variável 'a' como tipo de dados 'NUMBER' e inicializá-la com o valor '1'.
  • Linha de código 4: Imprimindo a declaração “Programa iniciado”.
  • Linha de código 5: A palavra-chave 'LOOP' marca o início do loop.
  • Linha de código 6: Imprime o valor de 'a'.
  • Linha de código 7: Aumenta o valor de 'a' em +1.
  • Linha de código 8: Verifica se o valor de 'a' é maior que 5.
  • Linha de código 9: A palavra-chave 'END LOOP' marca o fim do bloco de execução.
  • O código da linha 6 à linha 8 continuará a ser executado até que 'a' atinja o valor 6, pois a condição retornará TRUE e o controle sairá do loop.
  • Linha de código 10: Imprimindo a declaração “Programa concluído”

Rotulagem de Loops

Em PL/SQL, os loops podem ser rotulados. O rótulo deve ser colocado entre “<<” e “>>”. A rotulagem de loops, especialmente em códigos de loop aninhados, proporcionará mais legibilidade. O rótulo pode ser fornecido no comando EXIT para sair desse loop específico. Usando o rótulo, o controle pode ser feito para sair diretamente do loop externo dos loops aninhados de qualquer lugar dentro dos loops, dando o comando exit seguido pelo rótulo do loop externo.

Rotulagem de Loops

<<OUTER_LOOP>>
LOOP 
	<execution_block_starts>
	.
	<<INNER_LOOP>>
	LOOP --inner
		<execution_part>
	END LOOP;
	.
	<executi_block_ends>
END LOOP;

Explicação da sintaxe:

  • Na sintaxe acima, o loop out possui mais um loop dentro dele.
  • O '< >' e '< >' são os rótulos desses loops.

Exemplo 1: Neste exemplo, imprimiremos um número começando em 1 usando a instrução de loop básico. Cada número será impresso tantas vezes quanto seu valor. O limite superior da série é fixado na parte de declaração do programa. Vamos aprender como podemos usar o conceito de rótulo para conseguir isso. Para isso, executaremos o seguinte código

Rotulagem de LoopsRotulagem de Loops

DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(‘Program started.' ); 
«outerloop»‭	‬
LOOP 
a:=a+1;
b:=l;
«inner loop»
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Explicação do código:

  • Linha de código 2-3: Declarando as variáveis ​​'a' e 'b' como tipo de dados 'NUMBER'.
  • Linha de código 4: Declarando a variável 'upper_limit' como tipo de dados 'NUMBER' com valor '4'
  • Linha de código 6: Imprimindo a declaração “Programa iniciado”.
  • Linha de código 7: O loop externo foi rotulado como “outer_loop”
  • Linha de código 9: O valor de 'a' é incrementado em 1.
  • Linha de código 11: O loop interno foi rotulado como “inner_loop”.
  • Linha de código 13: Condição EXIT que verifica se o valor 'a' é superior ao valor 'upper_limit'. Caso contrário, ele irá mais longe, caso contrário, sairá diretamente do loop externo.
  • Linha de código 14: Imprimindo o valor de 'b'.
  • Linha de código 15: Aumenta o valor de 'b' em +1.
  • Linha de código 16: Condição EXIT que verifica se o valor de 'b' é maior que 'a'. Nesse caso, ele sairá do controle do loop interno.
  • Linha de código 14: Imprimindo a declaração “Programa concluído”

Resumo

laço Ciclo Básico
Critério de saída Saia quando encontrar a palavra-chave 'EXIT' na parte de execução
Uso É bom usar quando a saída não se baseia em nenhuma condição específica.