On Fri, Mar 13, 2009 at 10:53 AM, André Volpato <
[email protected]> wrote:

> Pessoal,
>
> Estou me matando aqui pra conseguir a quantidade de registros retornada em
> uma query, usando PL/PGSQL.
>
> Além da quantidade de registros, preciso interagir com os resultados da
> query.
>
>
> O problema é que eu preciso desse valor *antes* de entrar no loop.
>

Que eu saiba ha' duas maneiras:

1) Rode um EXECUTE ou SELECT INTO sozinho e use o GET DIAGNOSTICS

2) Rode um SELECT INTO com uma consulta usando COUNT(*)

Nao sei por que -- mas deve haver um bom motivo -- usar GET DIAGNOSTICS ...
ROW_COUNT dentro de um laco (LOOP) nao funciona. Sempre retorna 0. Como voce
notou. Mas se voce rodar fora do laco, ele te da' o numero correto.


> (...)
> for result in EXECUTE query
> loop
>        GET DIAGNOSTICS qtd = ROW_COUNT;
>        -- retorna 0 sempre ;(
> end loop;


Exato.


> Ou então, preciso saber se tem algum jeito de interagir com uma variável do
> tipo "record".
>
>
> (...)
> EXECUTE query into result;
> GET DIAGNOSTICS qtd = ROW_COUNT;
>
> for i in i...qtd
> loop
>        -- aqui preciso de todos os registros de result
>        -- por exemplo: result linha "i"
> end loop;
>
>
Nao da', a menos que voce rode o EXECUTE dentro de um laco como na versao
acima.

Uma terceira alternativa e' usar um CURSOR (
http://www.postgresql.org/docs/8.3/interactive/plpgsql-cursors.html), que te
da' algumas vantagens (ir adiante/atras, ir adiante/atras X registros,
registros relativos, etc) mas infelizmente o ROW_COUNT nao funciona tambem:

CREATE OR REPLACE FUNCTION foo_test() RETURNS INTEGER AS
$$
DECLARE
    rec RECORD;
    count INTEGER;
    cursor1 refcursor;
BEGIN
    OPEN cursor1 SCROLL FOR SELECT * FROM test;
    GET DIAGNOSTICS count = ROW_COUNT;
    RAISE NOTICE 'Count is %', count;
    FETCH cursor1 INTO rec;
    RAISE NOTICE 'ID is %', rec.id;
    CLOSE cursor1;
    RETURN 1;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;

A quarta opcao e' utilizar visoes materializadas. Ha' um modulo no
pgfoundry:

http://pgfoundry.org/projects/snapshot/ (de um Brasileiro, Cristiano Duarte,
homepage nao encontrada)

Se alguem souber de outras solucoes, sou todo ouvidos.

Abracos,

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

Responder a