Introdução
Nesse artigo vamos explorar as Nested IF Statements em Oracle PL/SQL. Você já deve estar familiarizado com as estruturas básicas de controle condicional, como IF-THEN, IF-THEN-ELSE e ELSIF. Mas e se eu te disser que podemos combinar essas estruturas de formas ainda mais poderosas? É isso que vamos aprender hoje!
O que são Nested IF Statements?
Imagine que você está organizando suas roupas. Primeiro, você separa entre roupas de verão e inverno. Mas dentro das roupas de verão, você ainda pode separar entre roupas de praia e roupas casuais. É assim que funcionam os Nested IF Statements – são decisões dentro de decisões!
Em PL/SQL, podemos colocar uma estrutura IF dentro de outra. Isso nos permite criar lógicas mais complexas e tomar decisões mais refinadas em nossos programas.
Estrutura Básica
Vamos ver um exemplo simples:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
DECLARE v_num1 NUMBER := &sv_num1; v_num2 NUMBER := &sv_num2; v_total NUMBER; BEGIN IF v_num1 > v_num2 THEN DBMS_OUTPUT.PUT_LINE('IF parte do IF externo'); v_total := v_num1 - v_num2; ELSE DBMS_OUTPUT.PUT_LINE('ELSE parte do IF externo'); v_total := v_num1 + v_num2; IF v_total < 0 THEN DBMS_OUTPUT.PUT_LINE('IF interno'); v_total := v_total * (-1); END IF; END IF; DBMS_OUTPUT.PUT_LINE('v_total = '||v_total); END; / |
Vamos ver uma representação visual:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
IF (condição externa) | +---> THEN | | | +---> Bloco de código | +---> ELSE | +---> IF (condição interna) | +---> THEN | | | +---> Bloco de código | +---> ELSE | +---> Bloco de código END IF END IF |
Essa representação mostra:
- O IF externo
- Os ramos THEN e ELSE do IF externo
- O IF interno dentro do ramo ELSE do IF externo
- Os ramos THEN e ELSE do IF interno
Vamos ver como isso se aplicaria ao nosso exemplo anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
IF (v_num1 > v_num2) | +---> THEN | | | +---> DBMS_OUTPUT.PUT_LINE('IF parte do IF externo') | | v_total := v_num1 - v_num2 | +---> ELSE | | | +---> DBMS_OUTPUT.PUT_LINE('ELSE parte do IF externo') | | v_total := v_num1 + v_num2 | | | +---> IF (v_total < 0) | | | +---> THEN | | | +---> DBMS_OUTPUT.PUT_LINE('IF interno') | | v_total := v_total * (-1) | END IF + END IF DBMS_OUTPUT.PUT_LINE('v_total = '||v_total) |
Neste exemplo, temos um IF externo e um IF interno. Vamos analisar:
- O IF externo compara
v_num1
ev_num2
. - Se
v_num1
for maior, ele subtraiv_num2
dev_num1
. - Caso contrário, ele soma os dois números.
- Dentro do ELSE, temos outro IF (o IF interno).
- Este IF interno verifica se o total é negativo e, se for, o torna positivo.
Como Funciona na Prática
amos supor que v_num1
seja -4 e v_num2
seja 3. Vamos seguir o fluxo:
- -4 não é maior que 3, então entramos no ELSE do IF externo.
- Somamos -4 e 3, resultando em -1.
- Como -1 é menor que 0, entramos no IF interno.
- Multiplicamos -1 por -1, tornando o resultado positivo.
O output seria:
1 2 3 |
ELSE parte do IF externo IF interno v_total = 1 |
Operadores Lógicos em Condições
Além de aninhar IFs, podemos usar operadores lógicos para criar condições mais complexas. Os principais são:
- AND: Ambas as condições devem ser verdadeiras.
- OR: Pelo menos uma condição deve ser verdadeira.
Vejamos um exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
DECLARE v_letter CHAR(1) := '&sv_letter'; BEGIN IF (v_letter >= 'A' AND v_letter <= 'Z') OR (v_letter >= 'a' AND v_letter <= 'z') THEN DBMS_OUTPUT.PUT_LINE('Isso é uma letra'); ELSE DBMS_OUTPUT.PUT_LINE('Isso não é uma letra'); IF v_letter BETWEEN '0' AND '9' THEN DBMS_OUTPUT.PUT_LINE('Isso é um número'); ELSE DBMS_OUTPUT.PUT_LINE('Isso não é um número'); END IF; END IF; END; / |
Este código verifica se o caractere inserido é uma letra (maiúscula ou minúscula) ou um número.
Níveis de Aninhamento
Você pode aninhar IFs quantas vezes quiser, mas lembre-se: com grande poder vem grande responsabilidade! Muitos níveis de aninhamento podem tornar seu código difícil de ler e manter.
Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
DECLARE v_var1 PLS_INTEGER := 100; v_var2 PLS_INTEGER := 200; v_var3 PLS_INTEGER := 300; v_var4 PLS_INTEGER := 400; BEGIN IF v_var1 >= 100 THEN IF v_var2 >= 200 THEN IF v_var3 >= 300 THEN IF v_var4 >= 400 THEN DBMS_OUTPUT.PUT_LINE('v_var1 = '||v_var1|| ', v_var2 = '||v_var2|| ', v_var3 = '||v_var3|| ', v_var4 = '||v_var4); END IF; END IF; END IF; END IF; END; / |
Este código funciona, mas não é a melhor prática. Uma alternativa mais limpa seria:
1 2 3 4 5 6 7 8 9 |
IF v_var1 >= 100 AND v_var2 >= 200 AND v_var3 >= 300 AND v_var4 >= 400 THEN DBMS_OUTPUT.PUT_LINE('v_var1 = '||v_var1|| ', v_var2 = '||v_var2|| ', v_var3 = '||v_var3|| ', v_var4 = '||v_var4); END IF; |
Conclusão
Nested IF Statements são uma ferramenta poderosa em PL/SQL. Eles nos permitem criar lógicas complexas e tomar decisões refinadas. Lembre-se:
- Você pode aninhar IFs dentro de outros IFs.
- Use operadores lógicos para combinar condições.
- Evite aninhar demais – às vezes, uma condição única com AND/OR é mais clara.
Pratique bastante e você verá como essa técnica pode tornar seus programas mais flexíveis e poderosos!