quinta-feira, 14 de março de 2013

Bug de 2013


Pra quem pensa que o Bug do Milênio foi o último envolvendo datas, aí vai a sensação do momento: O Bug de 2013.
O Bug ocorre na seguinte situação:
* O programa X grava dados de data na tabela usando o seguinte formato de datas:  YYYYMMDD.* O programa Y lê dessa tabela usando o formato DDMMYYYY. (Sim, é um erro, um bug no programa).
Até o ano de 2012, este erro não aparecia, veja um exemplo:
* O programa X salva a data 23-abr-2011 =  20110423 (YYYYMMDD)
* Quando essa data era lida pelo programa Y, ele lia  20110423 (DDMMYYYY) = 20-nov-0423. Data errada, mas não acusava erro!
 Pois o ano de 2013 chegou e esse erro apareceu. Veja:
* O programa X salva a data23-abr-2013 =  20130423 (YYYYMMDD)
* Quando essa data era lida pelo programa Y, ele lia  20130423 (DDMMYYYY) = 20-???-0423. Como não existe mês 13, dá erro!
O interessante é que esse bug está aparecendo só agora, depois de muitos anos de erro oculto. Finalmente em 2013 ele está fazendo os programas pararem de rodar.

quarta-feira, 13 de março de 2013

Comparação com NULL


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 comparação também será falso.

Veja abaixo:


DECLARE
  C1 VARCHAR2(20) := NULL;
  C2 VARCHAR2(20) := '13240';
BEGIN
  IF C1 <> C2 THEN
    DBMS_OUTPUT.PUT_LINE('é diferente');
  ELSE
    DBMS_OUTPUT.PUT_LINE('é igual');
  END IF;
END;

Resultado: é igual



DECLARE
  C1 VARCHAR2(20) := NULL;
  C2 VARCHAR2(20) := '13240';
BEGIN
  IF C1 = C2 THEN
    DBMS_OUTPUT.PUT_LINE('é diferente');
  ELSE
    DBMS_OUTPUT.PUT_LINE('é igual');
  END IF;
END;

Resultado: é igual

Em ambos os scripts, mesmo tendo alterado as comparações o resultado sempre entra no else.

Para resolver este problema, sempre que realizar uma comparação e o campo a ser comparado permitir NULL em seu conteúdo deve-se usar a função NVL para trocar o valor NULL por qualquer outro valor (o valor vai depender do tipo de comparação desejada) para que a comparação possa ser feita.


DECLARE
  C1 VARCHAR2(20) := NULL;
  C2 VARCHAR2(20) := '13240';
BEGIN
  IF nvl(C1,'*') <> C2 THEN
    DBMS_OUTPUT.PUT_LINE('é diferente');
  ELSE
    DBMS_OUTPUT.PUT_LINE('é igual');
  END IF;
END;

Restulado: é diferente




Related Posts Plugin for WordPress, Blogger...