Oracle Instrução PL/SQL IF THEN ELSE: ELSIF, NESTED-IF
O que são declarações de tomada de decisão?
As declarações de tomada de decisão são aquelas que decidirão o controle de fluxo de SQL declarações baseadas nas condições. Dá ao programador um melhor controle para impedir a execução de um código específico (diagrama 1) ou escolher um código desejado com base na condição (diagrama 2). Abaixo está a representação pictórica da “Declaração de Tomada de Decisão”.

Tipos de declarações para tomada de decisão:
Oracle fornece os seguintes tipos de declarações de tomada de decisão.
- SE ENTÃO
- SE-ENTÃO-ELSE
- SE-ENTÃO-ELSIF
- NESTED-IF
- CASO
- CASO PESQUISADO
Declaração SE-ENTÃO
A instrução IF-THEN é usada principalmente para executar uma seção específica de códigos somente quando a condição for satisfeita.
A condição deve render Booleano (Verdadeiro falso). É uma instrução condicional básica que permitirá ao ORACLE executar/pular um determinado trecho de código com base nas condições predefinidas.
Sintaxe para instruções IF THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- Na sintaxe acima, a palavra-chave 'IF' será seguida por uma condição avaliada como 'TRUE'/'FALSE'.
- O controle executará o somente se a condição retornar .
- No caso de condição avaliada como então, o SQL irá pular o , e começará a executar o código próximo ao bloco 'END IF'.
Nota: Sempre que a condição for avaliada como 'NULL', o SQL tratará 'NULL' como 'FALSE'.
Exemplo 1: Neste exemplo vamos imprimir uma mensagem quando o número for maior que 100. Para isso vamos executar o seguinte código
Para imprimir uma mensagem quando um número tem valor superior a 100, executamos o seguinte código.
DECLARE a NUMBER :=10; BEGIN dbms_output.put_line(‘Program started.' ); IF( a > 100 ) THEN dbms_output.put_line('a is greater than 100'); END IF; dbms_output.put_line(‘Program completed.'); END; /
Explicação do código:
- Linha de código 2: Declarando a variável 'a' como tipo de dados 'NUMBER' e inicializando-a com o valor '10'.
- Linha de código 4: Imprimindo a instrução “Programa iniciado”.
- Linha de código 5: Verificando a condição se a variável 'a' é maior que '100.'
- Linha de código 6: Se 'a' for maior que '100', então “a é maior que 100” será impresso. Se 'a' for menor ou igual a 100, a condição falhará, portanto a instrução de impressão acima será ignorada.
- Linha de código 8: Imprimindo a declaração “Programa concluído”.
Saída de código:
Program started. Program completed.
2 exemplo: Neste exemplo, imprimiremos uma mensagem se um determinado alfabeto estiver presente nas vogais do inglês (A, E, I, O, U).
Para imprimir uma mensagem quando o caractere fornecido for Vogal, executamos o seguinte código.
DECLARE a CHAR(1) :=’u’; BEGIN IF UPPER(a) in ('A’,'E','I','0','U' ) THEN dbms_output.put_line(‘The character is in English Vowels'); END IF; END; /
Explicação do código:
- Linha de código 2: Declarar a variável 'a' como 'CHAR' do tipo de dados de tamanho '1' e inicializá-la com o valor 'u'.
- Linha de código 4: Verificando a condição, se a variável 'a' está presente na lista ('A','E','I','O','U').
- O valor de 'a' foi convertido para maiúsculas antes da comparação para fazer com que a comparação não faça distinção entre maiúsculas e minúsculas.
- Linha de código 5: Se 'a' estiver presente na lista, a declaração “O caractere está em vogais inglesas” será impressa. Se a condição falhar, então este programa não fornecerá nenhuma saída, pois fora do bloco IF-THEN não emitimos nenhuma instrução de impressão.
Saída de código:
The character is in English Vowels
Declaração IF-THEN-ELSE
- A instrução IF-THEN-ELSE é usada principalmente para selecionar entre duas alternativas com base na condição.
- Abaixo está a representação da sintaxe da instrução IF-THEN-ELSE.
Sintaxe para instruções IF-THEN-ELSE:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_blockl> ELSE -execute if the condition failed (returns FALSE) <action_block2> END if;
- Na sintaxe acima, a palavra-chave 'IF' será seguida por uma condição avaliada como 'TRUE'/'FALSE'.
- O controle executará o somente se a condição retornar .
- No caso de condição avaliada como então, o SQL será executado .
- Em qualquer caso, um dos dois blocos de ação será executado.
Nota: Sempre que a condição for avaliada como 'NULL', o SQL tratará 'NULL' como 'FALSE'.
Exemplo 1: Neste exemplo, vamos imprimir uma mensagem se o número fornecido é ímpar ou par.
DECLARE a NUMBER:=11; BEGIN dbms_output.put_line (‘Program started'); IF( mod(a,2)=0) THEN dbms_output.put_line('a is even number' ); ELSE dbms_output.put_line('a is odd number1); END IF; dbms_output.put_line (‘Program completed.’); END; /
Explicação do código:
- Linha de código 2: Declarando a variável 'a' como tipo de dados 'NUMBER' e inicializando-a com o valor '11'.
- Linha de código 4: Imprimindo a instrução “Programa iniciado”.
- Linha de código 5: Verificando a condição se o módulo da variável 'a' por '2' é 0.
- Linha de código 6: Se '0', então “a é um número par” será impresso.
- Linha de código 7: Se o valor do módulo não for igual a '0', então a condição retorna , então a mensagem “a é um número ímpar” será impressa.
- Linha de código 10: Imprimindo a declaração “Programa concluído”
Saída de código:
Program started. a is odd number Program completed.
Declaração IF-THEN-ELSIF
- A instrução IF-THEN-ELSIF é usada principalmente onde uma alternativa deve ser escolhida de um conjunto de alternativas, onde cada alternativa tem suas próprias condições a serem satisfeitas.
- As primeiras condições que retornam será executado e as condições restantes serão ignoradas.
- A instrução IF-THEN-ELSIF pode conter o bloco 'ELSE'. Este bloco 'ELSE' será executado se nenhuma das condições for satisfeita.
Observação: O bloco ELSE é opcional nesta instrução condicional. Se não houver nenhum bloco ELSE e nenhuma das condições for satisfeita, o controlador irá pular todo o bloco de ação e começar a executar a parte restante do código.
Sintaxe para instruções IF-THEN-ELSIF:
IF <conditionl: returns Boolean> THEN -executed only if the condition returns TRUE < action_blockl> ELSIF <condition2 returns Boolean> < action_block2> ELSIF <condition3:returns Boolean> < action_block3> ELSE —optional <action_block_else> END if;
- Na sintaxe acima, o controle executará o somente se a condição1 retornar .
- Se a condição1 não for satisfeita, o controlador verificará a condição2.
- O controlador sairá da instrução IF nos dois casos a seguir.
- Quando o controlador encontrou alguma condição que retorna . Neste caso, o action_block correspondente será executado e o controlador sairá deste bloco de instruções IF e começará a executar o código restante.
- Quando nenhuma das condições for satisfeita, o controlador então executará o bloco ELSE, se presente, e então sairá da instrução IF.
Nota: Sempre que a condição for avaliada como 'NULL', o SQL tratará 'NULL' como 'FALSE'.
1 exemplo: Sem bloco ELSE
Neste exemplo, vamos imprimir a nota com base nas notas fornecidas sem outra condição (nota> = 70 Nota A, nota> = 40 e nota <70 Nota B, nota> = 35 e nota <40 Nota C).
DECLARE mark NUMBER :=55; BEGIN dbms_output.put_line(‘Program started.’ ); IF( mark >= 70) THEN dbms_output.put_line(‘Grade A’); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(‘Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(‘Grade C’); END IF; dbms_output.put_line(‘Program completed.’); END; /
Explicação do código:
- Linha de código 2: Declarando a variável 'mark' como tipo de dados 'NUMBER' e inicializando-a com o valor '55'.
- Linha de código 4: Imprimindo a instrução “Programa iniciado”.
- Linha de código 5: Verificando a condição1, se 'marca' é maior ou igual a 70.
- Linha de código 7: Como a condição1 falhou, a condição2 '70>mark>=40′ é verificada.
- Linha de código 8: A condição2 retorna , daí a mensagem 'Grau B' será impressa.
- Linha de código 12: Imprimindo a declaração “Programa concluído”.
- Neste caso, a condição3 'marca < 35' será ignorada, pois o controlador encontrou uma condição que retorna antes da condição3.
Saída de código:
Program started. Grade B Program completed.
Exemplo 2: Com bloco ELSE
Neste exemplo, vamos imprimir a nota com base nas notas fornecidas com a condição else (nota> = 70 Nota A, nota> = 40 e nota <70 Nota B, nota> = 35 e nota <40 Nota C, senão 'Sem nota').
DECLARE mark NUMBER :=25; BEGIN dbms_output.put_line(‘Program started.’ ); IF( mark >= 70) THEN dbms_output.put_line(‘Grade A’); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(‘Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(‘Grade C); ELSE dbms_output.put_line(‘No Grade’); END IF; dbms_output.put_line(‘Program completed.' ); END; /
Explicação do código:
- Linha de código 2: Declarando a variável 'mark' como tipo de dados 'NUMBER' e inicializando-a com o valor '25'.
- Linha de código 4: Imprimindo a instrução “Programa iniciado”.
- Linha de código 5: Verificando a condição 1, se 'marca' é maior ou igual a 70.
- Linha de código 7: Como a condição1 falhou, a condição2 '70>mark>=40′ é verificada.
- Linha de código 8: Como a condição2 falhou, a condição3 '40>mark>=35′ é verificada.
- Linha de código 11: Como todas as condições falharam, o controle agora verificará a presença do bloco ELSE e imprimirá a mensagem 'No Grade' do bloco ELSE.
- Linha de código 14: Imprimindo a declaração “Programa concluído”.
Saída de código:
Program started. No Grade Program completed.
Declaração NESTED-IF
- A instrução NESTED-IF basicamente permite que os programadores coloquem uma ou mais condições 'IF' dentro de outra condição 'IF' além de declarações normais.
- Cada condição 'IF' deve ter uma instrução 'END IF' separada que marca o fim do escopo daquela condição específica. .
- A instrução 'IF' considerará a instrução 'END IF' mais próxima como um ponto final para aquela condição específica.
- A representação pictórica do NESTED-IF é mostrada no diagrama abaixo.
IF <conditionl: returns Boolean> THEN —executed only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; —END IF corresponds to condition2 <action_blockl ends> END IF; —END IF corresponds to condition1
Explicação da sintaxe:
- Na sintaxe acima, o IF externo contém mais uma instrução IF em seu bloco de ação.
- A condição1 retorna , então o controle estará executando e verifica a condição1.
- Se a condição2 também retornar , então também será executado.
- No caso da condição2 avalia como então, o SQL irá pular o .
Aqui veremos um exemplo de Nested If –
Exemplo de instrução If aninhada: maior de três números
Neste exemplo, imprimiremos o maior de três números usando a instrução Nested-If. Os números serão atribuídos na parte de declaração, como você pode ver no código abaixo, ou seja, Number= 10,15 e 20 e o número máximo será obtido usando instruções nested-if.
DECLARE a NUMBER :=10; b NUMBER :=15; c NUMBER :=20; BEGIN dbms_output.put_line(‘Program started.' ); IF( a > b)THEN /*Nested-if l */ dbms_output.put_line(’Checking Nested-IF 1'); IF( a > c ) THEN dbms_output.put_line(‘A is greatest’); ELSE dbms_output.put_line(‘C is greatest’); END IF; ELSE /*Nested-if2 */ dbms_output.put_line('Checking Nested-IF 2' ); IF( b > c ) THEN dbms_output.put_line(’B is greatest' ); ELSE dbms_output.put_line(’C is greatest' ); END IF; END IF; dbms_output.put_line(‘Program completed.’ ); END; /
Explicação do código:
- Linha de código 2: Declarando a variável 'a' como tipo de dados 'NUMBER' e inicializando-a com o valor '10'.
- Linha de código 3: Declarando a variável 'b' como tipo de dados 'NUMBER' e inicializando-a com o valor '15'.
- Linha de código 4: Declarando a variável 'c' como tipo de dados 'NUMBER' e inicializando-a com o valor '20'.
- Linha de código 6: Imprimindo a instrução “Programa iniciado” (linha 6).
- Linha de código 7: Verificando a condição1, se 'a' é maior que 'b' (linha 7).
- Linha de código 10: Se 'a' for maior que 'b, então a condição em 'nested-if 1' verificará se 'a' é maior que 'c' (linha 10).
- Linha de código 13: Se ainda assim 'a' for maior, então a mensagem 'A é maior' será impressa (linha 11). Caso contrário, se a condição2 falhar, 'C é maior' será impresso (linha 13).
- Linha de código 18: Caso a condição1 retorne falso, a condição em 'nested-if 2' verificará se 'b' é maior que 'c' (linha 18).
- Linha de código 21: Se 'b' for maior que 'c' , então a mensagem 'B é maior' será impressa (linha 19), caso contrário, se a condição2 falhar, então 'C é maior' será impresso (linha 21).
- Linha de código 24: Imprimindo a declaração “Programa concluído” (linha 24).
Saída do código:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Resumo
Neste capítulo, aprendemos as diferentes declarações de tomada de decisão, sua sintaxe e exemplos. A tabela abaixo fornece o resumo de várias declarações condicionais que discutimos.
TIPO | DESCRIÇÃO | USO |
---|---|---|
SE ENTÃO | Verifica se há uma condição booleana, se o código TRUE no bloco 'THEN' for executado. | Para pular/executar um código específico com base na condição. |
SE-ENTÃO-ELSE | Verifica se há uma condição booleana, se o código TRUE no bloco 'THEN' será executado, se o código falso no bloco 'ELSE' for executado. | Mais apropriado na condição 'ISSO OU AQUILO'. |
SE-ENTÃO-ELSIF | Verifica uma condição booleana em ordem sequencial. O primeiro bloco da sequência que retornar a condição TRUE será executado. Se nenhuma das condições da sequência for TRUE, o código no bloco 'ELSE' será executado. | Costumava escolher entre mais de duas alternativas principalmente. |
NESTED-IF | Permite uma ou mais instruções IF-THEN ou IF-THEN-ELSIF dentro de outra(s) instrução(ões) IF-THEN ou IF-THEN-ELSIF. | Usado principalmente em situações de condição aninhada. |