Dicas SQL

Procedure para retornar estrutura de ARVORE (sumário) usando SQL e CURSOR

Essa procedure pode ser usada para resumir informações de uma tabela em um formato mais fácil de ler e entender. Em vez de exibir cada linha separadamente, o sumário agrupa as informações por pai, mostrando os filhos de cada pai em uma única linha. Isso pode ser útil para analisar grandes conjuntos de dados ou para criar relatórios mais concisos e legíveis.

Sempre nos deparamos com ordenação e criação de estrutura de árvore no nosso dia a dia. Então segue uma procedure comentada que pode ajudar o processo.

Exemplo de tabela e informações:

CREATE TABLE my_table (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  parent_id INT
);

INSERT INTO my_table (id, name, parent_id) VALUES
(1, 'A', 0),
(2, 'B', 1),
(3, 'C', 2),
(4, 'D', 0),
(5, 'E', 1),
(6, 'F', 5),
(7, 'G', 5),
(8, 'H', 7),
(9, 'I', 8),
(10, 'J', 8),
(11, 'K', 0)

Resultado esperado:

  1. A.B.C
  2. D
  3. A.E.F.G.H.I.J
  4. K

Procedure comentada:

CREATE PROCEDURE get_summary()
BEGIN
-- Declaração de variáveis para guardar os dados das colunas
DECLARE done INT DEFAULT FALSE;
DECLARE id INT;
DECLARE name VARCHAR(255);
DECLARE parent_id INT;

-- Variável para armazenar o sumário construído
DECLARE summary VARCHAR(255);

-- Cursor para percorrer as linhas da tabela
DECLARE cur CURSOR FOR SELECT id, name, parent_id FROM my_table ORDER BY id;

-- Handler para lidar com o fim das linhas do cursor
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- Abre o cursor
OPEN cur;

-- Inicializa a variável de sumário
SET summary = '';

-- Loop para ler cada linha do cursor
read_loop: LOOP
FETCH cur INTO id, name, parent_id;

-- Se não houver mais linhas, sai do loop
IF done THEN
LEAVE read_loop;
END IF;

-- Verifica se o parent_id é 0, o que indica que é o início de um novo grupo de linhas
IF parent_id = 0 THEN
-- Se já tiver algum sumário construído, exibe-o
IF summary != '' THEN
SELECT summary;
END IF;

-- Inicializa o novo sumário com o pai atual
SET summary = CONCAT('linha ', id, ' ', name);
ELSE
-- Se não for o início de um novo grupo, adiciona o nome do filho ao sumário
SET summary = CONCAT(summary, '.', name);
END IF;
END LOOP;

-- Exibe o último sumário construído
SELECT summary;

-- Fecha o cursor
CLOSE cur;
END;

E ai ? essa procedure foi util para você ? se sim, deixe um comentário para nos incentivar a continuar.

Lucas Dalcolmo

About Author

Sou desenvolvedor de software a mais de 13 anos com experiência nacioanl e internacional. Já produzi softwares para grandes empresas no Brasil e também bancos em Portugal. Possuo as certificações microsoft AZ-900, DP-900, AI-900 e AZ-204 (azure developer associate). Sou fundador da Dallm Games Studio (@dallmgamesstudio) e fui mentor em vários eventos de desenvolvimento de jogos. Também fui mentor do NASA SPACE JAM 2024 na área de desenvolvimento de software.

Deixe um comentário

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

Receba as últimas notícias por email

    Cadastre-se, receba nossas novidades em primeira mão por email, antes de todo mundo.

    Codeinsider @2025. Todos os direitos reservados.

    Desenvolvido por House Comunicação