FAQ Procura Membros Registre-se Perfil MP's Login/Out
Veja também:
Trigger específica em apenas um campo da tabela
[Dica] Comparação de Campos NULL

 
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> PL/SQL
Mensagem Autor
Enviada: Sáb, 15 Mai 2004 7:14 pm     Assunto: [Dica] Comparação de Campos NULL

Sabemos que quando um variável ou um campo no Oracle está NULL, ele não pode ser simplesmente comparado a um outro valor, pois o resultado da compração também será false!

Código:
declare
  a number:=null;
  b number:=null;
begin
  if a=b
  then dbms_output.put_line('SIM');
  else  dbms_output.put_line('não');
  end if;
end;

SQL> /
não


POUCO EFICIENTE

Para "sanar" este problema, é possivel usar NVL, que não é uma boa prática. Veremos porque:

Código:
if nvl(a, 123456789) = nvl(b, 123456789)
then --seu código

Isso funciona, se o valor for diferente de 123456789. Se o valor for igual, ferra a comparação!

MUITO EFICIENTE

A melhor prática possível

É um pouco trabalhosa, mas sempre funcionará:
Código:

if a<>b
or (a is null and b is not null)
or (a is not null and b is null)
then --seu codigo

dr_gori
Moderador
Moderador


Registrado em: Seg, 3 de Mai de 2004
Mensagens: 3222
Cidade - UF: Porto Alegre - RS


Enviada: Qui, 19 Ago 2004 11:24 am     Assunto: NULL IS NULL

Como podem ver Null não é igual, ou diferente
de null, ou maior ou menor.

Quando você compara Null, deve ser sempre
IS NULL ou IS NOT NULL

Cuidado quando você usa NVL em consultas do tipo:

Código:
select 1 from  TABELA
WHERE codigo = NVL(VARIAVEL, codigo  )


Isso funciona pra trazer todos os valores da Tabela quando a variavel for igual ao código, mas se o código for Null, não funcionará...

prefira usar:

Código:
select 1 from  TABELA
WHERE codigo = VARIAVEL
OR       (codigo is null and VARIAVEL is null)






O código abaixo não mostra nada.
Código:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2  A NUMBER DEFAULT NULL;
  3  B NUMBER DEFAULT NULL;
  4  BEGIN
  5    IF A = B THEN
  6       DBMS_OUTPUT.PUT_LINE('NULL É IGUAL A NULL');
  7    ELSIF A != B THEN
  8       DBMS_OUTPUT.PUT_LINE('NULL É DIFERENTE DE NULL');
  9    END IF;
 10  END;
 11  /


Procedimento de PL/SQL concluído com êxito.
_________________
Charles Mafra
Oracle Developer
charlesmafra
Rank: Estagiário Sênior
Rank: Estagiário Sênior


Registrado em: Qui, 19 de Agosto de 2004
Mensagens: 8
Cidade - UF: Angola


Enviada: Ter, 07 Jul 2009 8:12 am     Assunto: SEMPRE FALSE

Resumindo:

SEMPRE, qualquer comparação com NULL retorna FALSE.
Sabendo isso, é só utilizar as funções ou IS NULL/IS NOT NULL para comparar.

Falow...
alexandre5150
Rank: Estagiário Júnior
Rank: Estagiário Júnior


Registrado em: Sex, 13 de Junho de 2008
Mensagens: 2
Cidade - UF: NOVO HAMBURGO - RS


Enviada: Sex, 17 Jul 2009 12:15 pm    

Boa dica !!!

Muita gente acaba esquecendo desses detalhes enquanto está codificando.
_________________
_________________
Rodrigo Póvoa
Analista de Sistemas Júnior
Oracle Developer
rodcapella
Rank: Programador Júnior
Rank: Programador Júnior


Registrado em: Ter, 7 de Julho de 2009
Mensagens: 19
Cidade - UF: Rio de Janeiro - RJ


Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> PL/SQL Todos os horários são GMT - 3 Hours
Página 1 de 1

 
 
. .