Хранимя процедура работает цеклически и выбирает дерево из подкаталогов базируясь на 1-м главном каталоге.
Задача не писать данные в таблицу tmp__index (постоянная таблица), а на лету генерировать временную таблицу и туда записовать данные , а после окончания работы процедуры удалить таблицу.
DELIMITER $$
DROP PROCEDURE IF EXISTS `GetAllCats`$$
CREATE PROCEDURE `GetAllCats` (in search_id INT,in zlevel INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE catalog_id INT;
DECLARE catalog_pid INT;
DECLARE catalog_names VARCHAR(255);
DECLARE cur1 CURSOR FOR SELECT * FROM `cats` where `parent`=search_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
IF zlevel<=0 THEN SET max_sp_recursion_depth=10;
ELSE SET max_sp_recursion_depth= zlevel+1; END IF;
OPEN cur1;
WHILE done = 0 DO
FETCH cur1 INTO catalog_id,catalog_names,catalog_pid;
IF NOT done THEN
insert into tmp__index set
id_s=catalog_id,
base=catalog_pid;
call GetAllCats(catalog_id,zlevel-1);
END IF;
END WHILE;
CLOSE cur1;
END$$
DELIMITER ;