- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 2 anos, 3 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
2 de setembro de 2022 às 2:19 pm #157070ElizaParticipante
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;2 de setembro de 2022 às 4:23 pm #157071José Laurindo ChiappaModeradorOi, 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…
2 de setembro de 2022 às 9:11 pm #157074MottaParticipanteNestes casos faço
if NVL(:OLD.DTVAL, TO_DATE(‘19000101′,’YYYYMMDD’)) = NVL(:NEW.DTVAL,TO_DATE(‘19000101′,’YYYYMMDD’) ) thenData válida mas fora de contexto de um sistema comum.
Lembrando nulo não é igual a nulo. Como disse o Chiappa.
6 de setembro de 2022 às 2:02 pm #157126ElizaParticipanteBoa tarde Chiappa e Motta,
Nunca precisei usar NVL com data…. achei interessante.
Vou testar.
Obrigada aos dois, pelas dicas.6 de setembro de 2022 às 4:05 pm #157127José Laurindo ChiappaModeradorBlz , 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.