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

Responder a