SdevLab – Banco de Dados | Função SQL Recursiva em Postgre

Fala Galera!

Segue abaixo um exemplo que eu fiz depois de muita luta, que é uma função recursiva em plpgsql.

Função SQL Recursiva em Postgre

A idéia é bastante simples. Eu tenho uma tabela usuarios. Cada usuário pode ser pai ou filho de alguem, a função busca todos os níveis de uma árvore genealógica apartir da geração atual, ou seja, se eu procurar meu pai, o resultado vai ser meu pai e eu, e um filho caso eu tivesse.

Segue o exemplo:

 CREATE OR REPLACE FUNCTION tree(integer) 
RETURNS SETOF groups AS $BODY$ 
declare result record; child record; 
temp record; begin select into 
result * from users 
where user_id = $1; if found then 
for child in select distinct user_id from users 
where parent_id = $1 loop for temp in select * from 
tree(child.group_id) loop return next temp; end loop; e
nd loop; end if; return next result; end; $BODY$ 
LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; 
ALTER FUNCTION tree(integer) OWNER TO postgres; 

Pra quem entende de recursividade, vai logo perceber que esta lógica é tão simples que nem precisa explicação, e pra quem não entende, vou tentar explicar em poucas palavras esta função:

– Primeiro eu busco o pai e jogo na variável registro. Na sequência, eu busco os filhos, e pra cada filho, chamo novamente a função pra ver se ele tem filhos, e pra cada filho do filho também, e pra cada neto, …, veja que a função “se chama” até os filhos acabarem.

Bom, acho que é isto, se alguem ficou na dúvida, poste o comentário!

Valeu,

att
sanoj
; )