Pular para o conteúdo
  • Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 2 anos, 3 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #157070
    Eliza
    Participante

      Bom dia,

      Tenho 2 campos tipo Date, estão vazias, em um arquivo.
      Preciso verificar se são iguais ou não no sistema. Fiz o comando abaixo mas ele acusa que estão diferentes. Usei até o TRIM pra ver se dava certo mas continua dizendo que não são iguais.

      if trim(:OLD.DTVAL) = trim(:NEW.DTVAL) then
      P_igual = ‘S’
      else
      P_igual = ‘N’
      end if;

      #157071
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Oi, tudo jóia ? Espero que sim…. Então, Acredito que o que te falta aí é o CONCEITO sobre NULLs (imagino que é Esse o caso quando vc diz que os campos estão vazios, na verdade estão nulos) : no Oracle (e em alguns outros RDBMSs) o NULL é um “valor impossível”, é uma AUSÊNCIA de valor válido – assim, um NULL ** não é ** Igual a NADA (nem a outro NULL!!), NULL não é Diferente de nada, o NULL é realmente um TERCEIRO valor, um valor INDETERMINADO, e é POR ISSO que nós temos operadores IS NULL / IS NOT NULL , que nós temos funções que transformam o NULL em um valor determinado (que é a NVL)….INCLUSIVE, eu acredito que era Essa a sua intenção com o TRIM, ie, Transformar o valor NULL em outro coisa – se era isso, tá errado, não funciona, quem transforma NULL em alguma outra coisa é o NVL…

        Então acredito que o teu código deveria ser :

        if NVL(:OLD.DTVAL, SYSDATE) = NVL(:NEW.DTVAL, SYSDATE) then
        P_igual = ‘S’;
        else
        P_igual = ‘N’;
        end if;

        SE REALMENTE OU vc tem ambas as colunas preenchidas OU vc tem ambas nulas esse código funciona okdoc… Já se vc tiver casos onde apenas UMA das colunas está nula MAS a outra coluna não, aí vc deveria fazer as alteraçÕes cabíveis…

        Abraços,

        Chiappa

        OBS : veja que eu Corrigi o seu código, vc tinha Esquecido o ; de finalizar o comando tanto na linha que atribui S quanto na linha que atribui N no ELSE…

        #157074
        Motta
        Participante

          Nestes casos faço
          if NVL(:OLD.DTVAL, TO_DATE(‘19000101′,’YYYYMMDD’)) = NVL(:NEW.DTVAL,TO_DATE(‘19000101′,’YYYYMMDD’) ) then

          Data válida mas fora de contexto de um sistema comum.

          Lembrando nulo não é igual a nulo. Como disse o Chiappa.

          #157126
          Eliza
          Participante

            Boa tarde Chiappa e Motta,

            Nunca precisei usar NVL com data…. achei interessante.
            Vou testar.
            Obrigada aos dois, pelas dicas.

            #157127
            Avatar photoJosé Laurindo Chiappa
            Moderador

              Blz , Eliza ? Então, na verdade esses conceitos todos que eu e o Motta falamos (ie, que NULL é uma AUSÊNCIA de valor, então NULL não é nem igual nem diferente A NADA, que NULL absolutamente NÃO É demarcado com espaços em branco, então TRIM não serve de nada, vc TEM que usar ou operadores tipo IS NULL / IS NOT NULL ou funções próprias tipo NVL para manipular nulos, etc) valem para QUALQUER DATATYPE, inclusive para DATE… Qualquer coluna de qualquer datatype, ou Qualquer Variável PL/SQL, o que seja, que estiver NULL vai SIM obedecer à esses conceitos….

              Abraços,

              José Laurindo Chiappa

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