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:
- A.B.C
- D
- A.E.F.G.H.I.J
- 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.