mysql-logos

Recursividade com Stored Procedure no MySQL

A pedidos segue como fazer uma Stored Procedure recursiva no Mysql.

É aconselhável ler estes tópicos antes:
Cursores
Stored Procedure

O nosso exemplo consiste em cadastrar vários elementos e fazer um relacionamento entre pais e filhos, a recursividade é usada para formar uma hierarquia, mostrando a geração de cada indiví­duo relacionado.
Uma função é considerada recursiva quando ela chama a si mesma diversas vezes.

Exemplo:

Geração ID Elemento Pai
1 1 A 0
2 2 AB 1
2 3 AC 1
2 4 AD 1
3 5 ADA 4
1 6 B 0
2 7 BA 6

A tabela tb_recursive precisa ter apenas 3 campos, o campo id_filho irá ser igual a 0 quando o elemento não tiver um pai.

A pergunta básica que se baseia o algoritmo da SP recursiva é: Sendo esse pai X, quem são os filhos dele?
Esta pergunta é feita para cada filho desse pai, e assim por adiante, até que não tenhamos mais descendentes. É importante identificar a geração desse pai para que se possa organizar a hierarquia.

Para facilitar, iniciamos a criação de uma SP que iniciará a busca dos filhos:

Iremos criar uma tabela temporária para armazenar os resultados da hierarquia dos elementos, e exibi-los depois da pesquisa.

Segue abaixo o código da SP recursiva:

Caso o elemento não contenha filhos a SP é encerrada e volta para quem a chamou.

Para executar a SP use:

Arquivo contendo todos os comandos recursive.zip

10 thoughts on “Recursividade com Stored Procedure no MySQL

  1. Olá,

    Estou usando o MySQL 5.0.11 e apresenta erro ao criar a procedure. Cria a tabela normalmente, mas nao cria a proc. Dá erro logo no comando DELIMITER $$

    Retirei-o e depois dá erro no DECLARE

    Uso MySQL 5.0.11 para Windows.

    Obrigado

  2. Estou recebendo uma mensagem de erro ao tentar criar uma simples stored procedure no mysql 0.0.11. Estou usando o MySQL Query Builder.
    Qualquer ajuda eu agradeço.

    Segue a stored:

    DELIMITER $$

    DROP PROCEDURE IF EXISTS test.st_teste_incluir $$
    CREATE PROCEDURE test.st_teste_incluir (
    IN vTitulo VARCHAR(45),
    IN vResumo VARCHAR(100),
    IN vMateria MEDIUMTEXT,
    IN vDataInc DATETIME
    )
    BEGIN

    INSERT INTO informacao (Titulo, Resumo, Materia, DataInc)
    VALUES (vTitulo, vResumo, vMateria, vDataInc);

    END $$

    DELIMITER ;

    Obrigado

  3. Olá, meu, realmente pela primeira vez eu vejo isso!
    Caraca, no MsSQL é mais facil… mas eu estou apanhando no MySQL, e não uso nenhum programa apenas PHPMyAdmin… e to pastando….

    Pra mim tá dando erro em tudo! ahahah

  4. Olá, muito bom o artigo!!! Estou usando ele em um trabalho de recursividade, porem, quando troco o “CALL sp_recursive_start(1);” de 1 pra 0, ele fica totalmente fora de padrão… Tem como me da uma ajuda nisso??
    Valeu!!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *