SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.12.2012 10:08:03

Greenlancer
Участник
Зарегистрирован: 18.12.2012
Сообщений: 5

Хранимка на удаление древовидной структуры.

Есть таблица описывающая все каталоги, в ней есть столбцы ID_Cat-идентификатор каталога, и ID_Parent-идентификатор родителя этого каталога. Необходимо написать хранимку которая будет удалять каталог по заданному ID_Cat со всеми подкаталогами.
Пытался реализовать через еще одну таблицу в которую заносятся id каталога который необходимо удалить и его lvlC вложенности, при этом ID_Cat поданный на вход процедуре lvlC=0, каждый следующий уровень вложенности lvlC+1.

[syntax=mysql]
CREATE DEFINER = 'root'@'localhost'
PROCEDURE filesystem.TR11(IN id_c VARCHAR(255))
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE lvl  INT;
  DECLARE a    INT;
  DECLARE cur1 CURSOR FOR SELECT id
                          FROM
                            TT
                          WHERE
                            lvlC = lvl-1;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  CREATE TABLE TT
  (
    id INT PRIMARY KEY,
    lvlC INT
  );
  SET lvl = 0;
  INSERT INTO TT (id, lvlC) VALUES (id_c, lvl);
  SET lvl = lvl + 1;
SET a = id_c;

  WHILE EXISTS (SELECT ID_Cat
              FROM
                catalog, TT
              WHERE
                catalog.ID_Parent = a
                AND TT.lvlC = lvl-1)
DO
               
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO a;
    IF NOT done THEN

      INSERT INTO TT (id, lvlC) VALUES (
        (SELECT ID_Cat
         FROM
           catalog
         WHERE
           catalog.ID_Parent = a), lvl);

    END IF;

  UNTIL done
  END REPEAT;
  SET lvl = lvl + 1;
  CLOSE cur1;

END WHILE;

  DELETE
  FROM
    filesystem.catalog
  WHERE
    ID_Cat = (SELECT id
              FROM
                TT);

  DROP TABLE TT;
END
 


Она работает но удаляет только каталог поданный на вход Процедуре.
Как это еще можно реализовать??

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson