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;