[firebase-br] UDF derrubando FB

Welkson Renny de Medeiros welkson em gmail.com
Ter Dez 16 17:25:59 -03 2008


Olá Sandro, boa tarde!


Quando existe uma função nativa eu prefiro usá-la, afinal é bem mais rápido 
que chamar uma função externa... a bronca é que funções que não existem 
nativamente, e acabamos aderindo as UDFs...

O pior é que já vi esse erro em 2 funções... com certeza vai acontecer em 
outras...

Li algo sobre RETURN NULL em UDF no FB 2.0... parece que o erro se refere a 
isso.

Tentei contato com o pessoal da UDF, espero que respondam... por enquanto 
vou desativando as UDFs e substituindo por outras que funcionem.

O engraçado é que testes com poucos registros funcionam perfeito, a bronca é 
quando envolve grandes volumes de dados.

Obrigado amigo.

Welkson


----- Original Message ----- 
From: "Sandro Souza" <escovadordebits em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, December 16, 2008 4:06 PM
Subject: Re: [firebase-br] UDF derrubando FB


Bom dia/tarde Welkson.

Amigo, sempre que for possível, prefira utilizar funções nativas que UDFs,
justamente por esses problemas de incompatibilidade entre versões diferentes
de Firebird.

Experimente testar essa versão nativa da LASTDAYMONTH:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LASTDAYMONTH (
    AYEAR INTEGER,
    AMONTH INTEGER)
RETURNS (
    RESULT INTEGER)
AS
DECLARE VARIABLE INICIO DATE;
BEGIN
  /* Já está em dezembro? */
  IF (AMONTH = 12) THEN
  BEGIN
    /* Avança para janeiro do próximo ano. */
    AMONTH = 1;
    AYEAR = AYEAR + 1;
  END
  ELSE
    /* Avança para o próximo mês do mesmo ano */
    AMONTH = AMONTH + 1;
  /* Gera a data referente a início do próximo mês */
  INICIO = CAST((LPAD(CAST(AYEAR  AS VARCHAR(4)),4,'0') || '-' ||
                 LPAD(CAST(AMONTH AS VARCHAR(2)),2,'0') || '-01') AS DATE);
  /* Obtém o dia da data anterior ao início do próximo mês, ou seja,
     o último dia do mês informado */
  RESULT = EXTRACT(DAY FROM (INICIO - 1));
  SUSPEND;
END^

SET TERM ; ^

DESCRIBE PARAMETER AYEAR PROCEDURE LASTDAYMONTH
'Ano de referência.';

DESCRIBE PARAMETER AMONTH PROCEDURE LASTDAYMONTH
'Mês de referência.';

DESCRIBE PARAMETER RESULT PROCEDURE LASTDAYMONTH
'Último dia do mês informado.';

GRANT EXECUTE ON PROCEDURE LASTDAYMONTH TO SYSDBA;

Eu criei essa função e testei-a aqui.

Espero ter ajudado mais que atrapalhado.

2008/12/16 Welkson Renny de Medeiros <welkson em gmail.com>

> Boa tarde amigos!
>
> Tenho algumas procedures que usam uma udf chamada LASTDAYMONTH (último dia
> do mês).
>
> Comecei usando essa UDF no FB 1.5 com o pacote RFUNC....
>
> Recente migrei para o Firebird 2.1 e o pacote RFUNC gerou vários erros e
> não funcionou... verifiquei no site e o mesmo está sem atualização a 5
> anos...
>
> Procurei um pouco e encontrei o FreeAdHocUDF que contem mais de 400 UDF,
> entre elas as "antigas" da RFunc funcionando no 2.1.
>
> Se tu testar essa procedure com pouco volume de dados ela funciona
> perfeitamente... com grande volume de dados ela derruba o servidor FB e
> grava a seguinte mensagem no log:
>
> FAKE (Server) Tue Dec 16 14:34:09 2008
> The user defined function:  LASTDAYMONTH
>   referencing entrypoint:  lastdaymonth
>                in module:  FreeAdhocUDF
> caused the fatal exception: Access violation.
>  The code attempted to access a virtual
>  address without privilege to do so.
> This exception will cause the Firebird server
> to terminate abnormally.
>
> Fiz o mesmo teste no servidor em PRODUÇÃO (Debian 4 - 2.6.18-6), e também
> no servidor de desenvolvimento (Windows XP SP3), e ocorre o MESMO 
> problema.
> Engraçado que semana passada ocorreu esse mesmo problema com outra udf, a
> substr... acabei substituindo pelo comando nativo SUBSTRING.
>
> Vi no histórico da lista que outras pessoas já tiveram esse problema.
>
> Como resolveram?
>
> E o RFUNC? vai morrer mesmo?
>
> --
> Welkson Renny
>
>
>                     Powered by ....
>
>                                          (__)
>                                       \\\'',)
>                                         \/  \ ^
>                                         .\._/_)
>
>                                     www.FreeBSD.org
>
> ______________________________________________
> 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
>
______________________________________________
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 





Mais detalhes sobre a lista de discussão lista