Controle de Fluxo em PL/SQL

 

O controle de fluxo em PL/SQL é essencial para a criação de lógicas complexas e para a execução condicional de blocos de código. Ele permite que o desenvolvedor direcione a execução do programa com base em condições e iterações. Neste post, abordaremos as principais estruturas de controle de fluxo em PL/SQL, incluindo estruturas condicionais, loops, e as instruções GOTO e CONTINUE.

Vantagens do Controle de Fluxo

  • Flexibilidade de Código: Permite a criação de lógicas complexas.
  • Eficiência: Melhora a eficiência do código ao evitar execuções desnecessárias.
  • Legibilidade: Facilita a compreensão do fluxo lógico do programa.
  • Modularidade: Possibilita a divisão do código em blocos menores e mais gerenciáveis.

Estruturas Condicionais

As estruturas condicionais permitem executar diferentes blocos de código com base em condições específicas.

Estrutura Condicional IF

A estrutura IF é usada para executar um bloco de código se uma condição for verdadeira. O IF pode ser combinado com ELSIF e ELSE para fornecer opções adicionais de execução.

 

Sintaxe:

IF condição THEN
  -- Bloco de código a ser executado se a condição for verdadeira
ELSIF outra_condição THEN
  -- Bloco de código a ser executado se a outra condição for verdadeira
ELSE
  -- Bloco de código a ser executado se nenhuma das condições anteriores for verdadeira
END IF;

Exemplo:

DECLARE
  v_salario NUMBER := 5000;
BEGIN
  IF v_salario < 3000 THEN
    DBMS_OUTPUT.PUT_LINE('Salário abaixo da média.');
  ELSIF v_salario BETWEEN 3000 AND 7000 THEN
    DBMS_OUTPUT.PUT_LINE('Salário médio.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Salário acima da média.');
  END IF;
END;

Este bloco de código verifica o valor da variável v_salario e imprime uma mensagem correspondente. Se o salário for menor que 3000, imprime ‘Salário abaixo da média’. Se estiver entre 3000 e 7000, imprime ‘Salário médio’. Caso contrário, imprime ‘Salário acima da média’.

 

DBMS Output

Salário médio.

Estrutura Condicional CASE

A estrutura CASE é utilizada para comparar uma expressão com vários valores possíveis e executar o bloco de código correspondente ao valor encontrado.

 

Sintaxe:

CASE expressão
  WHEN valor1 THEN
    -- Bloco de código a ser executado se a expressão for igual a valor1
  WHEN valor2 THEN
    -- Bloco de código a ser executado se a expressão for igual a valor2
  ELSE
    -- Bloco de código a ser executado se nenhum dos valores for correspondente
END CASE;

Exemplo:

DECLARE
  v_mes NUMBER := 5;
BEGIN
  CASE v_mes
    WHEN 1 THEN
      DBMS_OUTPUT.PUT_LINE('Janeiro');
    WHEN 2 THEN
      DBMS_OUTPUT.PUT_LINE('Fevereiro');
    WHEN 3 THEN
      DBMS_OUTPUT.PUT_LINE('Março');
    WHEN 4 THEN
      DBMS_OUTPUT.PUT_LINE('Abril');
    WHEN 5 THEN
      DBMS_OUTPUT.PUT_LINE('Maio');
    ELSE
      DBMS_OUTPUT.PUT_LINE('Mês inválido');
  END CASE;
END;

Este bloco de código usa a estrutura CASE para comparar o valor de v_mes com vários valores possíveis (1, 2, 3, 4, 5) e imprime o nome do mês correspondente. Se v_mes não corresponder a nenhum desses valores, imprime ‘Mês inválido’.

 

DBMS Output

Maio

Loops

Loops são utilizados para repetir um bloco de código várias vezes.

Loop FOR

O loop FOR é usado quando o número de iterações é conhecido antecipadamente. Ele itera sobre um intervalo definido.

 

Sintaxe:

FOR variável IN intervalo LOOP 
  -- Bloco de código a ser executado para cada valor no intervalo 
END LOOP;

Exemplo:

DECLARE
  v_total NUMBER := 0;
BEGIN
  FOR i IN 1 .. 5 LOOP
    v_total := v_total + i;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Total: ' || v_total);
END;

Este loop FOR executa cinco iterações, variando a variável i de 1 a 5. Em cada iteração, o valor atual de i é adicionado à variável v_total. Isso significa que na primeira iteração, v_total recebe 1; na segunda, recebe 1 + 2, e assim por diante, até a última iteração, onde v_total soma todos os valores de 1 a 5. Após o término do loop, a instrução DBMS_OUTPUT.PUT_LINE é usada para imprimir o valor total acumulado em v_total.

 

DBMS Output

Total: 15

Loop WHILE

O loop WHILE executa o bloco de código enquanto a condição especificada for verdadeira. Se a condição nunca for verdadeira, o loop pode não ser executado.

 

Sintaxe:

WHILE condição LOOP
  -- Bloco de código a ser executado enquanto a condição for verdadeira
END LOOP;

Exemplo:

DECLARE
  v_contador NUMBER := 1;
  v_total    NUMBER := 0;
BEGIN
  WHILE v_contador <= 5 LOOP
    v_total    := v_total + v_contador;
    v_contador := v_contador + 1;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Total: ' || v_total);
END;

Este loop WHILE continua a executar enquanto v_contador for menor ou igual a 5. Em cada iteração, adiciona v_contador a v_total e incrementa v_contador em 1. Após o loop, imprime o valor total.

 

DBMS Output

Total: 15

Observação: Para evitar loops infinitos, é fundamental garantir que a condição do loop eventualmente se torne falsa. No exemplo acima, a variável v_contador é incrementada em cada iteração, assegurando que o loop terminará quando v_contador exceder 5.

 


Loop LOOP

O loop LOOP é uma estrutura de loop básica que deve ser encerrada com uma instrução EXIT. Ele pode ser usado quando o número de iterações não é conhecido previamente.

 

Sintaxe:

LOOP
  -- Bloco de código a ser executado
  EXIT WHEN condição; -- Condição para encerrar o loop
END LOOP;

Exemplo:

DECLARE
  v_contador NUMBER := 1;
  v_total    NUMBER := 0;
BEGIN
  LOOP
    v_total    := v_total + v_contador;
    v_contador := v_contador + 1;
    EXIT WHEN v_contador > 5;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Total: ' || v_total);
END;

Este loop LOOP continua a executar indefinidamente até que a condição v_contador > 5 seja verdadeira, momento em que a instrução EXIT termina o loop. Em cada iteração, adiciona v_contador a v_total e incrementa v_contador em 1. Após o loop, imprime o valor total.

 

DBMS Output

Total: 15

Instruções GOTO e CONTINUE

Instrução GOTO

A instrução GOTO permite desviar o fluxo de execução para um rótulo específico dentro do mesmo bloco PL/SQL. É importante usá-la com cautela para evitar criar código difícil de seguir.

 

Sintaxe:

<<rótulo>>
BEGIN
  GOTO rótulo;
  -- Bloco de código
END;

Exemplo:

BEGIN
  <<inicio>>
  DBMS_OUTPUT.PUT_LINE('Início do bloco');
  GOTO fim;
  DBMS_OUTPUT.PUT_LINE('Este código será ignorado');
  <<fim>>
  DBMS_OUTPUT.PUT_LINE('Fim do bloco');
END;

Este bloco de código usa a instrução GOTO para desviar a execução do programa do rótulo inicio para o rótulo fim, ignorando qualquer código entre essas instruções. Imprime ‘Início do bloco’ e ‘Fim do bloco’, mas não imprime ‘Este código será ignorado’.

 

DBMS Output

Início do bloco
Fim do bloco

Instrução CONTINUE

A instrução CONTINUE é usada para pular o restante do código em um loop e iniciar a próxima iteração. Esta instrução é útil para evitar a execução de certos blocos de código com base em condições específicas.

 

Sintaxe:

LOOP
  -- Bloco de código
  CONTINUE WHEN condição;
  -- Bloco de código a ser ignorado se a condição for verdadeira
END LOOP;

Exemplo:

DECLARE
  v_num NUMBER := 0;
BEGIN
  FOR i IN 1 .. 10 LOOP
    v_num := i * 2;
    IF v_num > 10 THEN
      CONTINUE; -- Pular o resto do código neste loop
    END IF;
    DBMS_OUTPUT.PUT_LINE('Número: ' || v_num);
  END LOOP;
END;

Este loop FOR calcula v_num como i * 2 para valores de i de 1 a 10. Se v_num for maior que 10, a instrução CONTINUE pula o restante do código no loop e inicia a próxima iteração. Caso contrário, imprime o valor de v_num.

 

DBMS Output

Número: 2
Número: 4
Número: 6
Número: 8
Número: 10

Considerações Finais

 

O controle de fluxo é um aspecto fundamental da programação PL/SQL, permitindo a construção de lógicas complexas e flexíveis para aplicações de banco de dados Oracle. Compreender e utilizar corretamente estruturas condicionais e loops ajuda a criar códigos mais eficientes e legíveis.

 

Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!

Deixe um comentário

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

Rolar para cima