Solução adotada... menos custosa!

 

Pragmatismo de longas datas em uso de cursores.

 

Rubens José Rodrigues

 

De: [email protected]
[mailto:[email protected]] Em nome de JotaComm
Enviada em: terça-feira, 6 de julho de 2010 11:53
Para: Comunidade PostgreSQL Brasileira
Assunto: Re: [pgbr-geral] "cursor xxxx already in use" : onde estou errando?

 

Olá,

Em 6 de julho de 2010 10:55, TI <[email protected]> escreveu:

Olá pessoal,

Preciso da ajuda de vocês no seguinte :

a)      Criei uma function que me retorna se um determinado funcionário está
de férias  neste caso eu passo como parâmetro de entrada o código do
funcionário e retorno “Verdadeiro” ou “Falso” em suas situações. O
funcionamento está ok se usada isoladamente (select * from
fnc_funcionario_afastado(matricula))

b)      Quando usamos a function acima dentro de um select, como por exemplo
: select matricula, nome from funcionários where
(fnc_funcionario_afastado(matricula))=false o sistema retorna a seguinte
mensagem de erro : cursor "_registros" already in use.


Você realmente precisa fazer este procedimento usando cursor? 

Eu propuria a seguinte solução:

CREATE OR REPLACE FUNCTION f_funcionario_afastado(INTEGER)

RETURNS boolean AS $$

BEGIN

IF EXISTS (SELECT datagozoini,datagozofim

    FROM historico_ferias

    WHERE codfuncionario=$1

    AND current_date BETWEEN datagozoini AND datagozofim

    ORDER BY 2) THEN

    RETURN TRUE;

END IF;

RETURN FALSE;

END;

$$ LANGUAGE PLPGSQL;
 

Cenário : PostgreSQL 8.4.1, compiled by Visual C++ build 1400, 32-bit  -->
Windows XP

Função :

CREATE OR REPLACE FUNCTION "public"."fnc_funcionario_afastado" ("eCodFunc"
integer) RETURNS boolean AS

$body$

DECLARE

  -- ferias

  _registros cursor for select datagozoini,

                               datagozofim

                          from historico_ferias

                         where codfuncionario=$1

                         order by datagozofim;

  registros record;                               

BEGIN

-- abrindo o cursor do historico das ferias do funcionario;

open _registros;

loop 

  fetch _registros into registros;

  exit when not found;

  if (current_date >= registros.datagozoini) and (current_date <=
registros.datagozofim) then

    return true;

    close _registros;

    exit;

  end if;

end loop;  

close _registros;

return false;

END;

$body$

LANGUAGE 'plpgsql'

VOLATILE

CALLED ON NULL INPUT

SECURITY INVOKER

COST 100;

Onde será que estou errando?

Obrigado e no aguardo,

Rubens José Rodrigues


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



[]s
-- 
JotaComm
http://jotacomm.wordpress.com

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a