Estou tentando escrever uma plpgsql
função que retorna recursivamente um conjunto de colunas de registros em uma estrutura de árvore.
Eu tenho uma tabela de dados e uma tabela para vincular os dados:
DATATABLE
-----------
id integer
value text
info text
LINKTABLE
-----------
link integer
parent integer
Meu pensamento era fazer como na seguinte função:
CREATE OR REPLACE FUNCTION my_function(itemID integer)
RETURNS TABLE(id integer, value text) AS
$BODY$
BEGIN
RETURN QUERY SELECT my_function(A.link) FROM linktable A, datatable B
WHERE A.parent = B.id AND B.id = itemID) C;
RETURN QUERY SELECT id, value FROM datatable WHERE id = itemID;
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Mas isso não funciona, recebo um erro na minha primeira consulta:
ERRO: a estrutura da consulta não corresponde ao tipo de resultado da função
Meu compilador Just-In-Brain não detecta problemas, então o que estou fazendo de errado aqui?
Você não precisa de uma função, isso pode ser feito com uma única instrução SQL:
Consulte o manual para obter uma introdução às consultas recursivas: http://www.postgresql.org/docs/current/static/queries-with.html
Se você tem certeza de que deseja fazer isso em uma função plpgsql, algumas modificações o farão funcionar:
.*
apósdatatable
, você deve qualificar os nomes de coluna na segunda consulta) C
para ter uma sintaxe adequadaDe qualquer forma, concordo com a_horse_with_no_name sobre o uso de CTEs.