terça-feira, 19 de junho de 2012

CURRENT nao é a data e hora real quando dentro de procedure

Estou postando aqui um email que recebi de um amigo/irmão, o Carlos.

Carlão um abraço e obrigado por compartilhar conosco.

abaixo segue o email dele.

Pessoal,

Tivemos um problema ao fazer uma procedure que usa o comando CURRENT para recuperar a data e hora do sistema.

Verificamos que se utilizado mais de uma vez dentro da procudure o mesmo retorna sempre a mesma informacao, mesmo depois de levar varios segundos/minutos entre um comando e outro;

No site da IBM explica que ele congela essa data e hora quando chamado uma procedure para retornar sempre a mesma informacao ate o termino da execução dela.

Por conta disso fomos atrás de outra forma de obte-la e encontramos a seguinte:

  SELECT DBINFO('utc_to_datetime', sh_curtime)

  FROM sysmaster:sysshmvals;

Como esse comando é bem mais complicado, criei uma função para retornar mais facilmente a data/hora, podendo ser chamada em suas procedures:

DROP FUNCTION current_time;

CREATE FUNCTION current_time()

RETURNING DATETIME YEAR TO FRACTION;

  DEFINE current_time DATETIME YEAR TO FRACTION;

  SELECT DBINFO('utc_to_datetime', sh_curtime)

  INTO current_time

  FROM sysmaster:sysshmvals;

  RETURN current_time;

END FUNCTION;

Exemplo de utilizacao:

select current_time() from empresa;

Para comparar a diferença basta fazer uma query com processamento demorado e comparar, o campo CURRENT vai mostrar a mesma data/hora para todos os registros, enquanto que a funcao CURRENT_TIME() apresentará a data/hora que 'printou' cada linha;

select current, current_time() from estoque_trans

by callprog

Um comentário: