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 FOR
loop 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 record
nã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.