Gostaria de saber se existe uma maneira de declarar uma variável da tabela de tipos no PL / pgSQL para manter os resultados da consulta? Por exemplo, como posso expressar algo como:
q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
for t2 in q2:
-- do something with t1 and t2
Eu olhei para a construção de retorno seguinte, mas isso parece capaz de lidar apenas com valores de retorno.
Respostas:
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
.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 retornoSETOF 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.
fonte
CREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...