- Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 15 anos, 7 meses atrás por
tidinas.
-
AutorPosts
-
22 de agosto de 2010 às 6:07 am #95630
tidinas
ParticipanteOlá pessoal!
Tenho uma dúvida que talvez seja simples para vocês, mas para mim, que estou iniciando em PL/SQL é um problema! rss
Seguinte: Preciso fazer um programa que receba 2 valores do usuário através de variáveis de substituição, uma para o salário e outra para o bonus. O programa deve apenas somar estes dois valores e apresentar o resultado. Até aqui sem problema. No entanto, deve haver tratamento de nulos para os valores, de forma que, se o usuário digitar um valor nulo o programa substitua esse valor por um valor default não nulo, ou que pelo menos o programa exiba uma mensagem de erro pedindo para o usuário digitar um valor válido.
Estou tentando fazer o seguinte, mas dá erro:
[i]
SET SERVEROUTPUT ON
ACCEPT sa PROMPT ‘Digite o salario anual: ‘
ACCEPT bo PROMPT ‘Digite o bonus a ser concedido: ‘DECLARE
sal NUMBER (7,2):= &sa;
bon NUMBER (6,2):=&bo;
salfinal NUMBER (8,2);BEGIN
IF sal IS NULL
THEN sal := 1000;
END IF;IF bon IS NULL
THEN bon := 100;
END IF;salfinal := sal+bon;
DBMS_OUTPUT.PUT_LINE(‘Com bonus deu: ‘ || salfinal);
END;
/[/i]Desde já, grato!!!
22 de agosto de 2010 às 8:10 am #95631burga
ParticipanteNo seu exemplo, se você não digitar algum valor pras variáveis ele vai substituir por NADA que é diferente de NULL.
Daí na declaração do seu bloco anônimo fica:
sal NUMBER (7,2):= ;
bon NUMBER (6,2):=;O que com certeza é pra dar erro…
Então, se você quer que ele considere o valor como nulo, você deve digitar NULL nos valores das variáveis de substituição, daí seu código funcionará!
Uma outra saída bem simples seria:
DECLARE
sal NUMBER (7,2) := NVL(to_number('&sa'),1000);
bon NUMBER (6,2) := NVL(to_number('&bo'),100);
salfinal NUMBER (8,2);
BEGIN
salfinal := sal+bon;
DBMS_OUTPUT.PUT_LINE('Com bonus deu: ' || salfinal);
END;
/Ainda assim, se você digitar alguma coisa que não seja número vai dar erro, mas a partir daí já da pra começar a brincar, mudar o código e até fazer um tratamento pra validar se o usuário informou NULL, NADA, um número válido (com diferentes formatações) ou uma cadeia de caracteres alfanuméricos…
22 de agosto de 2010 às 8:34 am #95632tidinas
ParticipanteMuito obrigado pela pronta resposta! rss
Só não entendi uma coisa. Tentei usar o NVL da forma abaixo mas não funcionou. Por que?
sal NUMBER (7,2) := NVL(&sa,1000);
bon NUMBER (6,2) := NVL(&bo,100);
22 de agosto de 2010 às 5:09 pm #95633burga
ParticipanteRespondendo a sua pergunta:
Não deu certo pelo mesmo motivo anterior. Variável de substituição é como se fosse uma variável “especial” pois ela não tem um tipo específico…
Se você não colocar ela entre aspas simples, pro programa ou comando considerá-la uma string, o que você informar que não for número não será feito nenhuma conversão implícita de dados, e o comando contendo a variável poderá considerar o valor dado como sendo nome de coluna, nome de tabela, etc… Exemplo:
select &coluna from &tabela;Então, dado o seu código:
sal NUMBER (7,2) := NVL(&sa,1000);
bon NUMBER (6,2) := NVL(&bo,100);Se você não informar nenhum valor, o comando após a substituição se transforma em:
sal NUMBER (7,2) := NVL(,1000);
bon NUMBER (6,2) := NVL(,100);Ou seja, você está passando NADA como um dos parâmetros da NVL e não NULL. Quando você coloca a variável entre aspas simples, como eu fiz no código anterior, ele fica:
sal NUMBER (7,2) := NVL('',1000);
bon NUMBER (6,2) := NVL('',100);Sendo que ” é uma string vazia, que é um valor NULO, por isto dessa forma funciona, mas daria erro se você passasse NULL como valor da variável, enquanto que nos códigos que você postou daria certo. É aí que começam os tratamentos de dados…
23 de agosto de 2010 às 4:02 am #95634tidinas
ParticipanteSuper interessante brother. Sua explicação foi perfeita, muito obrigado!!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.