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
