Se eu não estou enganado, alguém estava trabalhando em cursores
bi-direcionais na pg-hackers.
[]'s
- Walter
On 3/3/07, Rodrigo Hjort <[EMAIL PROTECTED]> wrote:
A instrução FETCH tem sintaxes bem distintas em SQL [1] e dentro da
PL/pgSQL [2]. Eis um exemplo de código.
-- esta função retorna um cursor ...
CREATE OR REPLACE FUNCTION listar_pessoa(ref refcursor)
RETURNS refcursor AS $$
BEGIN
OPEN ref FOR
SELECT id, nome FROM pessoa ORDER by id;
RETURN ref;
END
$$ LANGUAGE plpgsql;
-- ... que pode ser facilmente navegado com instruções SQL de dentro de
uma mesma transação
BEGIN;
SELECT listar_pessoa('cur1');
FETCH NEXT FROM "cur1";
FETCH NEXT FROM "cur1";
FETCH PRIOR FROM "cur1";
CLOSE "cur1";
END;
-- aparentemente não é possível navegar num cursor para outra direção
senão para frente e de 1 em 1 de dentro da PL/pgSQL
CREATE OR REPLACE FUNCTION listar_inverso_pessoa(ref refcursor)
RETURNS SETOF pessoa AS $$
DECLARE
rec record;
BEGIN
-- FETCH NEXT FROM ref; -- causa um erro de compilação
FETCH ref INTO rec;
RETURN NEXT rec;
RETURN;
END
$$ LANGUAGE plpgsql;
-- sendo assim, resta fazer as instruções por fora mesmo
BEGIN;
SELECT listar_pessoa('cur2');
FETCH LAST FROM "cur2";
FETCH PRIOR FROM "cur2";
SELECT * FROM listar_inverso_pessoa('cur2');
END;
Mas se você estiver processando diversos registros em uma função em
PL/pgSQL e precisar voltar um registro, pode sempre armazenar o ponteiro
(record) da última linha. Talvez resolva o seu problema.
Ou senão, melhor ainda, utilize os códigos-fontes do PostgreSQL e
implemente essa funcionalidade em PL/pgSQL! :)
[1] FETCH [ direction { FROM | IN } ] cursorname
http://www.postgresql.org/docs/8.2/interactive/sql-fetch.html
[2] FETCH cursor INTO target
http://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html#PLPGSQL-CURSOR-USING
--
Atenciosamente,
Rodrigo Hjort
Icewall Tecnologias
http://www.icewall.com.br
2007/2/24, Alan <[EMAIL PROTECTED]>:
>
> Olá pessoal,
>
> Após varias tentativas, sem sucesso, de usar FECTH PRIOR em uma função
> PL/PGSQL.
> Peço a ajuda da lista, para alguma dica ou exemplo de uma função que
> execute um "FETCH PRIOR FROM cursor" em uma função PL/PGSQL.
>
> Desde já, agradeço pela atenção.
>
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios