Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #95630
    tidinas
    Participante

      Olá 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!!!

      #95631
      burga
      Participante

        No 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…

        #95632
        tidinas
        Participante

          Muito 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);

          #95633
          burga
          Participante

            Respondendo 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…

            #95634
            tidinas
            Participante

              Super interessante brother. Sua explicação foi perfeita, muito obrigado!!!

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.