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




segunda-feira, 4 de março de 2013

Flashback

FLASHBACK TABLE serve para restaurar uma tabela a um estado anterior devido a um erro qualquer.

É recomendável que o parâmetro de inicialização UNDO_MANAGEMENT esteja definido como AUTO e   o parâmetro UNDO_RETENTION para um intervalo grande o suficiente para incluir os dados que você imagina que seja necessário, para maiores informações consulte:  UNDO_MANAGEMENT e UNDO_RETENTION.


Veja também:

É necessário ter permissão para executar o FLASHBACK ou o FLASHBACK ANY TABLE.


Exemplos

Restaurar uma tabela para um estado anterior: Exemplos
Os exemplos abaixo criar uma nova tabela, employees_demo , com movimento de linha ativado, atualizar valores dentro da nova tabela, e emitir o FLASHBACK TABLE comunicado.
Criar tabela employees_demo , com movimento de linha habilitada, a partir de tabela employees da amostra hr esquema:

CREATE TABLE employees_demo 
  ENABLE ROW MOVEMENT
  AS SELECT * FROM employees;
Como referência, listar os salários inferiores a 2500:

SELECT salary
  FROM employees_demo
  WHERE salary < 2500;
SALARY ---------- 2400 2200 2100 2400 2200

Nota:
Para dar tempo para o SCN para propagar a tabela de mapeamento usado pelo FLASHBACK TABLE declaração, espere um mínimo de 5 minutos antes de emitir a seguinte declaração. Esta espera não seria necessária se uma tabela previamente existentes foram usados ​​neste exemplo.
Emitir um aumento salarial de 10% aos funcionários que ganham menos de 2500:

UPDATE employees_demo
  SET salary = salary * 1.1
  WHERE salary < 2500;

5 rows updated.
COMMIT;
Como referência segunda, listar os salários que permanecem menos de 2500 na sequência do aumento de 10%:

SELECT salary
  FROM employees_demo
  WHERE salary < 2500;
SALÁRIO ---------- 2420 2310 2420
Restaurar a tabela employees_demo ao seu estado de um minuto antes da hora do sistema atual:

FLASHBACK TABLE employees_demo
  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);
Listar esses salários inferiores a 2500. Após o FLASHBACK TABLE comunicado emitido, esta lista deve coincidir com a lista na primeira referência.

SELECT salary
  FROM employees_demo
  WHERE salary < 2500;
SALÁRIO ---------- 2400 2200 2100 2400 2200

Recuperando uma tabela descartada: Exemplo
Se você acidentalmente deixar cair o hr.employees tabela e deseja recuperá-lo, emitir a seguinte declaração:

FLASHBACK TABLE employees TO BEFORE DROP;
Se outra employees tabela foi criada na hr esquema, use a RENAME TO cláusula para renomear a tabela acessado:

FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_old;
Se você sabe que a tabela de funcionários foi derrubado várias vezes, e você deseja recuperar a versão mais antiga, consultar o USER_RECYLEBIN tabela para determinar o nome gerado pelo sistema e, em seguida, usar esse nome no FLASHBACK TABLE comunicado. (Sistema de nomes gerados em seu banco de dados diferentes daqueles mostrados aqui.)

SELECT object_name, droptime FROM user_recyclebin 
   WHERE original_name = 'employees';
DROPTIME OBJECT_NAME ------------------------------------------------- RB $ 45703 $ $ TABELA $ 0 2003-06-03:15:26:39 RB 45704 $ $ $ $ 0 TABELA 2003-06-12:12:27:27 RB 45705 $ $ $ $ 0 TABELA 2003-07-08:09:28:01



Related Posts Plugin for WordPress, Blogger...