| Viva!
Estou a utilizar curosres em Postgresql já à algum tempo e sem problemas (A ferramenta que estou a utilizar é o Realbasic). As funções NEXT, PRIOR, FIRST e LAST funcionam sem problemas.
Algum código de exemplo:
// Para declarar o cursor: DECLARE cursor_clientes SCROLL CURSOR WITH HOLD FOR SELECT * FROM gc_clientes ORDER BY n_cliente;
// Para ir para o ultimo registo: FETCH LAST FROM cursor_clientes;
// Para ir para o primeiro registo: FETCH FIRST FROM cursor_clientes;
// Para ir para o registo seguinte: FETCH NEXT FROM cursor_clientes;
// Para ir para o registo anterior: FETCH PRIOR FROM cursor_clientes;
Este código têm funcionado sem qualquer problema, mas sendo este codigo de um programa muito simples, eu não estou a utilizar FUNCTION e não sei se o problema no seu caso não poderá ser do modo como está a usar.
Atentamente
A. Cascalheira
On Mar 26, 2007, at 1:35 PM, Walter Cruz wrote: 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
Para editar suas opções ou sair da lista acesse a página da lista em: ************************************ Here is my Visit Card:
|