[firebase-br] SP travando

Kelver Merlotti kmerlotti em gmail.com
Ter Set 23 15:22:36 -03 2008


Salve galera.. a solução foi a seguinte:

SleepUdf.dll -> feita em delphi
-- #####
function DoSleep(var i: Integer): Integer; cdecl; export;
begin
  try
    Sleep(i);
  finally
    result := 0;
  end;
end;

Exports
  DoSleep;
-- #####

No banco:
-- #####
DECLARE EXTERNAL FUNCTION DOSLEEP
    INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'DoSleep' MODULE_NAME 'SleepUdf'
-- #####

Dessa maneira, agora eu consigo dentro da minha procedure aguardar N
segundos antes de continuar. E pra confirmar a sobre o retorno do
CURRENT_TIMESTAMP ou do CAST('NOW' as TIMESTAMP) dentro de uma
procedure, fiz o seguinte teste:

CREATE PROCEDURE PROC_TESTE_SLEEP
returns (
    endnow date,
    endtime date)
as
declare variable i integer;
begin
  I = 0;
  WHILE (I < 10) DO
  BEGIN
    ENDTIME = CURRENT_TIMESTAMP;
    ENDNOW  = CAST('NOW' AS TIMESTAMP);
    I = I + 1;
    DOSLEEP(1000);
    SUSPEND;
  END
  SUSPEND;
end

Ao executá-la, tive o seguinte retorno em 10 segundos:

ENDTIME	                ENDNOW
23/09/2008 15:27:17	23/09/2008 15:27:17
23/09/2008 15:27:17	23/09/2008 15:27:18
23/09/2008 15:27:17	23/09/2008 15:27:19
23/09/2008 15:27:17	23/09/2008 15:27:20
23/09/2008 15:27:17	23/09/2008 15:27:21
23/09/2008 15:27:17	23/09/2008 15:27:22
23/09/2008 15:27:17	23/09/2008 15:27:23
23/09/2008 15:27:17	23/09/2008 15:27:24
23/09/2008 15:27:17	23/09/2008 15:27:25
23/09/2008 15:27:17	23/09/2008 15:27:26
23/09/2008 15:27:17	23/09/2008 15:27:26

Conclusão: Conforme nossos amigos Adriano e Eduardo falaram,
CAST('NOW' AS TIMESTAMP) retornou o horário correto de cada instante
em que foi chamado, já o CURRENT_TIMESTAMP retornou em todos os
momentos o horário em que a SP foi disparada.

Só pra complementar, o ambiente é Windows, com FB21 e BD no dialeto 1.
Fica aí a dica.

Obrigado a todos e um forte abraço!!

2008/9/23 Eduardo Pelizzari de Andrade <eduardoandrade em persoft.com.br>:
> mas continua com problema, inserindo os parentes e usando o 'now'?
>
> Se continuar com problema, depure ele da seguinte forma, crie uma
> tabela, com os campos que estão sendo comparados e faça um insert a cada
> loop. Adicione um contador e coloque ele no teste do while de forma a
> garantir a saída do loop e analise o resultado da tabela.
>
> Eduardo Pelizzari de Andrade
> Persoft Softwares Aplicativos
>
>
>
>
> Kelver Merlotti escreveu:
>> boa Edu.. pelos testes que fiz, não houve problemas até então em usar
>> o 24/60/60, até porque são os mesmos operadores e possuem a mesma
>> precedência. De qualquer forma, é sempre bom evitar surpresas..
>> adotarei a técnica dos parenteses..
>> obrigado e até mais!!
>>
>> 2008/9/23 Eduardo Pelizzari de Andrade <eduardoandrade em persoft.com.br>:
>>
>>> kelver, Eu não tenho certeza como será calculado 1/24/60/60, se ele fará
>>> o calculo da esquerda para direita ou da direita para a esquerda, isto
>>> faria diferença, experimente usar 1 / (24*360) e como sugerio o magno
>>> tente cast('now' as timestamp) no lugar de current_timestamp.
>>>
>>> Eduardo Pelizzari de Andrade
>>> Persoft Softwares Aplicativos
>>>
>>>
>>>
>>>
>>> Kelver Merlotti escreveu:
>>>
>>>> captei.. valew!!
>>>> to trabalhando numa solução aqui e assim que terminar compartilho com a galera..
>>>> abraços!
>>>>
>>>> 2008/9/23 Adriano dos Santos Fernandes <adrianosf em uol.com.br>:
>>>>
>>>>
>>>>> Kelver Merlotti escreveu:
>>>>>
>>>>>
>>>>>> Realmente Eduardo, da primeira forma não funcionaria, mas conforme
>>>>>> postei novamente - já corrigido - ainda não funcionou:
>>>>>>
>>>>>> Magno.. fiz como o sugerido e infelizmente continua travando se
>>>>>> executo ela via select.. o fb para de responder.. depurando ela roda
>>>>>> normalex! já num select * from mysleep(10000) ela nunca mais retorna..
>>>>>> Veja como ficou:
>>>>>>
>>>>>> CREATE PROCEDURE MYSLEEP (
>>>>>>    ms integer)
>>>>>> returns (
>>>>>>    endtime date)
>>>>>> as
>>>>>> declare variable tmp date;
>>>>>> begin
>>>>>>  ENDTIME = CURRENT_TIMESTAMP;
>>>>>>  TMP = ENDTIME + (MS / 1000) * (1/24/60/60);
>>>>>>  WHILE (ENDTIME < TMP) DO
>>>>>>    ENDTIME = CURRENT_TIMESTAMP;
>>>>>>
>>>>>>
>>>>> De acordo com o padrão SQL, CURRENT_TIMESTAMP deve retornar o horário
>>>>> que a procedure foi iniciada. E é por isso o loop infinito.
>>>>>
>>>>> Achei que a constante TIMESTAMP 'NOW' resolveria o problema mas parece
>>>>> que não. Acho que vc vai precisar de uma UDF que retorne a hora real atual.
>>>>>
>>>>>
>>>>> Adriano
>>>>>
>>>>>
>>>>> ______________________________________________
>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------------------
>>>>
>>>>
>>>> No virus found in this incoming message.
>>>> Checked by AVG - http://www.avg.com
>>>> Version: 8.0.169 / Virus Database: 270.7.1/1686 - Release Date: 23/09/2008 07:38
>>>>
>>>>
>>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>> No virus found in this incoming message.
>> Checked by AVG - http://www.avg.com
>> Version: 8.0.169 / Virus Database: 270.7.1/1686 - Release Date: 23/09/2008 07:38
>>
>>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



-- 
Kelver Merlotti
Coordenador Editorial do Portal www.ActiveDelphi.com.br
Contato: kelver em activedelphi.com.br
Google: kmerlotti em gmail.com
Msn: kmerlotti em hotmail.com




Mais detalhes sobre a lista de discussão lista