
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!