[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