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”.

Diagrama de declaração de tomada de decisão
Diagrama de 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.

Declaração NESTED-IF

Declaração NESTED-IF

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.