No PostgreSQL , todo nome de tabela serve como nome do tipo para o tipo de linha (também conhecido como tipo composto ) automaticamente - não um tipo de tabela, não existem "tipos de tabela" ou "variáveis de tabela" no Postgres ( mas existem tabelas digitadas ).
Então você pode simplesmente declarar uma variável desse tipo PL/pgSQL.
CREATE FUNCTION foo()
RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
q1 foo; -- "foo" ...
q2 bar; -- ... and "bar" are existing (visible) table names
BEGIN
FOR q1 IN
SELECT * from foo
LOOP
FOR q2 IN
SELECT * from bar
LOOP
-- do something with q1 and q2
-- since q1 and q2 are well known types, you can access columns
-- with attribute notation. Like: q1.col1
END LOOP;
END LOOP;
END
$func$
Um FORloop funciona com um cursor interno. Também existem cursores explícitos no plpgsql.
Você também pode apenas declarar variáveis do tipo genérico record. Pode levar qualquer tipo de linha na atribuição automaticamente. Mas regras especiais se aplicam. Certifique-se de seguir o link e ler o capítulo do manual!
Embora muitas vezes seja conveniente retornar a função SETOF <table name>, o retorno SETOF recordnão é tão conveniente. O sistema não sabe o que a função retorna dessa maneira e você deve adicionar uma lista de definições de coluna a cada chamada. O que é uma dor. Detalhes sobre as funções da tabela no manual .
Muitas vezes, existem soluções mais eficientes com SQL simples. O loop é uma medida de último recurso, quando você pode fazer as coisas em uma varredura em que precisaria de várias varreduras no SQL puro.