DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`subordinate`(IN `vWorker` INT, IN `vBaseCase` BOOLEAN) NO SQL BEGIN -- deprecated usar vn.worker_GetHierarch DECLARE vAuxWorker INT; IF vBaseCase THEN SET @@max_sp_recursion_depth = 5 ; DROP TEMPORARY TABLE IF EXISTS subordinate; CREATE TEMPORARY TABLE subordinate (INDEX (Id_Trabajador)) ENGINE = MEMORY SELECT vWorker Id_Trabajador, TRUE visited, 0 boss; END IF; INSERT INTO subordinate SELECT Id_Trabajador, FALSE, vWorker FROM Trabajadores WHERE boss = vWorker; IF (SELECT COUNT(*) FROM subordinate WHERE NOT visited AND vWorker = boss LIMIT 1) > 0 THEN SELECT Id_Trabajador INTO vAuxWorker FROM subordinate WHERE NOT visited AND vWorker = boss LIMIT 1; REPEAT CALL subordinate(vAuxWorker, FALSE); UPDATE subordinate SET visited = TRUE WHERE Id_Trabajador = vAuxWorker; SET vAuxWorker = 0; SELECT Id_Trabajador INTO vAuxWorker FROM subordinate WHERE NOT visited AND vWorker = boss LIMIT 1; UNTIL vAuxWorker = 0 END REPEAT; END IF; IF vWorker = 2 THEN INSERT INTO subordinate SET Id_Trabajador = vWorker, visited = TRUE, boss = vWorker; END IF; END$$ DELIMITER ;