Translate

Estruturas de Decisão PL/SQL

Estruturas de Decisão

Autor: Prof. Paulo Kaupa

 

As estruturas de Decisão, condicionam o fluxo do código, o que possibilita executar partes diferentes de um código de acordo com uma condição. Exemplo: Para que um Brasileiro possa obter a carteira de habilitação (CNH) é necessário que ele tenha 18 anos de idade, então a condição mínima para habilitar um cidadão brasileiro é que ele tenha 18 ou mais, se este cidadão ainda não atingiu a idade mínima não poderá ter sua CNH.

Se houvesse um código para tratar a situação descrita no exemplo, teriam dois trechos de código que seriam executados de acordo com a condição atendida: Se 18 anos ou mais o candidato pode prosseguir para obter a CNH, se não este cidadão será orientado a voltar quando atingir a idade mínima.

As estruturas de decisão básicas são IF-THEN-ELSE e CASE-WHEN. Estas estruturas checam se uma condição é verdadeira ou falsa e prosseguem conforme programado.

Instrução IF-THEN_ELSE

                Sintaxe IF-THEN-ELSE:

                               IF <CONDIÇÃO> THEN

                                               < CÓDIGO A SER EXECUTADO se CONDIÇÃO-01 for Verdadeira>

                               ELSE

                                               <CÓDIGO A SER EXECUTADO se a CONDIÇÃO-01 for Falsa >

                               END IF;

 

                Exemplo 1:

SET SERVEROUTPUT ON;

 

DECLARE v_idadeCandidato NUMBER(38);

 

BEGIN

 

  v_idadeCandidato := 20; --Informe outros valores para testar seu código.

 

  IF v_idadeCandidato>=18  THEN 

                 DBMS_OUTPUT.PUT_LINE ('Prossiga com o processo de Habilitação');

   ELSE

                DBMS_OUTPUT.PUT_LINE ('Volte quando completar 18 anos');

   END IF;

 

END;

 

                No exemplo 1, a instrução IF-THEN-ELSE avalia o conteúdo da variável  v_idadeCandidato, se o valor contido na variável for maior ou igual a 18, a mensagem ‘Prossiga com o processo de Habilitação’ será exibida na tela, mas se o valor for  menor que 18 será impressa na tela a mensagem ‘Volte quando completar 18 anos’.

                No PL-SQL como em outras linguagens é possível usar diversas condições encadeadas, o que é chamado de IF Encadeado:

                Sintaxe do IF Encadeado:

                               IF <CONDIÇÃO-01> THEN

                                               <CÓDIGO A SER EXECUTADO se CONDIÇÃO-01 Verdadeira>

                               ELSIF <CONDIÇÃO-02> THEN

                                               <CÓDIGO A SER EXECUTADO se CONDIÇÃO-02 Verdadeira >

                               ELSE

                                               <CÓDIGO A SER EXECUTADO se as 1 e 2 forem Falsas >

                               END IF;

 

Exemplo 2:

SET SERVEROUTPUT ON;

 

DECLARE v_corSemaforo VARCHAR2(40);

 

BEGIN

 v_corSemaforo := 'AMARELO';

 

 IF v_corSemaforo='VERDE' THEN

                DBMS_OUTPUT.PUT_LINE ('Prossiga.');

 ELSIF v_corSemaforo='AMARELO' THEN

 DBMS_OUTPUT.PUT_LINE ('Atenção.');

 ELSE

 DBMS_OUTPUT.PUT_LINE ('Pare.');

 END IF;

END;

Exercício proposto IF-THEN-ELSE

1 – Elabore um bloco de código que calcule a Média de um aluno sendo que suas notas (AV1, AV2 e AV3) estão gravadas em uma tabela. O código deverá inserir na tabela a Média Calculada junto com o código da situação de acordo com os dados abaixo:

                Se Média entre 0 e 5, COD_SITUACAO = 3 --‘Reprovado’

                Se Média entre 5,1 e 5,9, COD_SITUACAO = 2 -- ‘Recuperação’

                Se Média maior ou igual a 6, COD_SITUACAO = 1 -- ‘Aprovado’

Observação: Para a realização do Exercício 1 é necessário criar uma tabela (TB_ALUNO) que contenha os seguintes campos: COD_ALUNO, NOME_ALUNO, AV1, AV2, AV3, MEDIA_FINAL e COD_SITUACAO.

 

Instrução CASE-WHEN

A instrução CASE-WHEN avalia um valor (expressão de teste) e executa um código com base em uma ou mais alternativas (WHEN). Para utilizar a estrutura de decisão CASE é necessário criar uma variável ou expressão para que seja comparada com os valores definidos na clausula WHEN.

Sintaxe CASE:

CASE <VARIÁVEL>

                WHEN VALOR1 THEN

                                  <CÓDIGO A SER EXECUTADO se VALOR1 for igual ao conteúdo da VARIÁVEL>

                WHEN VALOR2 THEN

                               <CÓDIGO A SER EXECUTADO se VALOR2 for igual ao conteúdo da VARIÁVEL>

                ELSE --Opcional

                               <CÓDIGO A SER EXECUTADO se o conteúdo da VARIÁVEL não for igual aos valores 1 e 2>

                END CASE;

 

Exemplo:

SET SERVEROUTPUT ON;

 

DECLARE v_codSituacaoAluno NUMBER(1);

 

BEGIN

                v_codSituacaoAluno  :=  1; -- Informe outros valores. Teste valores maiores que 9.

                CASE v_codSituacaoAluno

                               WHEN 3 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Reprovado');

                               WHEN 2 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Aprovado');

                               WHEN 1 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno ficou de Recuperação');

                               ELSE

                                               DBMS_OUTPUT.PUT_LINE ('Código de Situação informado inválido!');

                END CASE;

END;

 

 

                Nota:  Se a clausula ELSE for omitida e o conteúdo da v_codSituacaoAluno  não for igual aos valores 1, 2 e 3 um erro será gerado. Rode o código a seguir para visualizar o erro.

 

SET SERVEROUTPUT ON;

 

DECLARE v_codSituacaoAluno NUMBER(1);

 

BEGIN

                v_codSituacaoAluno  :=  4;

                CASE v_codSituacaoAluno

                               WHEN 3 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Reprovado');

                               WHEN 2 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Aprovado');

                               WHEN 1 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno ficou de Recuperação');

                END CASE;

END;

 

Para tratar o erro gerado deve-se usar a sessão EXCEPTION do bloco de códigos PL-SQl:

SET SERVEROUTPUT ON;

 

DECLARE v_codSituacaoAluno NUMBER(1);

 

BEGIN

                v_codSituacaoAluno  :=  4;

                CASE v_codSituacaoAluno

                               WHEN 3 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Reprovado');

                               WHEN 2 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno foi Aprovado');

                               WHEN 1 THEN

                                               DBMS_OUTPUT.PUT_LINE ('O Aluno ficou de Recuperação');

                END CASE;

 

EXCEPTION

  WHEN CASE_NOT_FOUND THEN

    DBMS_OUTPUT.PUT_LINE('O Valor informado não foi encontrado');

 

END;

 

Exercício proposto (CASE WHEN)

1 – Elabore um bloco de código que imprima na tela a mensagem correspondente ao valor informado em uma variável de acordo com as informações a seguir:

Valor da Variável

Mensagem

A

Excelente

B

Muito Bom

C

Bom

D

Ruim

E

Muito Ruim

 

 

 

 

 

Variável de Substituição

 

Para tornar a entrada de dados mais amigável durante sua execução no SQL Developer use uma Variável de Substituição, que é uma janela com um campo para digitar o valor e um botão para envio do valor.

 

Sintaxe:

 

v_nomeVariavel tipo  := ('&Palavra_Sugestiva:'); 

 

Onde:

                ('&Palavra_Sugestiva:') Abre uma janela para a digitação.

Palavra_Sugestiva: Palavra que sugere o conteúdo que deve ser digitado.

               

Exemplo:

 

SET SERVEROUTPUT ON;

 

DECLARE

                v_codEstagioSemaforo NUMBER(1) := ('&Informe_1_2_ou_3');

 v_estagioSemaforo VARCHAR2(20);

BEGIN

 v_estagioSemaforo :=

CASE v_codEstagioSemaforo

 WHEN 1 THEN 'Verde'

 WHEN 2 THEN 'Amarelo'

 WHEN 3 THEN 'Vermelho'

 ELSE

'Valor Inválido'

 END;

 

 DBMS_OUTPUT.PUT_LINE ('Estágio:  ' || v_estagioSemaforo);

END;

 

CASE Pesquisada

 

Com a expressão CASE Pesquisada não há uma expressão de teste, as condições são dadas e avaliadas na clausula WHEN, desta forma pode-se verificar se um valor está entre um intervalo de valores ou se o valor informado está abaixo ou acima de outros valores.

 

Exemplo:

 

DECLARE

    v_nota NUMBER(2) := ('&NOTA');

    v_avaliacao VARCHAR2(20);

BEGIN

    v_avaliacao :=

    CASE

        WHEN v_nota = 10 THEN 'Nota Excelente'

        WHEN v_nota IN (7,8,9) THEN 'Nota Boa'

        WHEN v_nota IN (5,6) THEN 'Nota Mediana'

        WHEN v_nota <= (4) THEN 'Nota Baixa'

        ELSE 'No such grade'

    END;

    DBMS_OUTPUT.PUT_LINE (v_avaliacao);

END;

Sobre o Autor:

Mestre em Engenharia de Produção pela Universidade Nove de Julho. Bacharel em Ciência da Computação também pela Universidade Nove de Julho. Atualmente é Professor de ensino superior (Universidade Nove de Julho), Analista de Sistemas na Empresa Atento e Pesquisador na área de Inteligência Computacional aplicada em investimentos na Bolsa de Valores de São Paulo. Possui experiência em Análise e desenvolvimento de sistemas, aplicações de Inteligência Computacional no Mercado de Ações, Análise Técnica para seleção de ações para investimentos na Bolsa de Valores. Curriculo Lattes: http://lattes.cnpq.br/0074185478343196