NestedSets

FANTAzeRus

Guest
NestedSets

Вопрос к тем кто занимался реализацией Subj'а на БД Interbase/Firebird. Если возможно поделитесь опытом создания хронимых процедур, тригеров и т.д. для работы с Subj'евыми деревьями.

-~{}~ 31.10.04 15:37:

Попробовал вроде получилось! Но прошу ЗНАЮЩИХ поправить если где ошибся! Пока нужны только ВСТАВКА и УДАЛЕНИЕ ...

CREATE PROCEDURE GET_NODE_INFO (
C_ID INTEGER)
RETURNS (
CLEFT INTEGER,
CRIGHT INTEGER,
CLEVEL INTEGER)
AS BEGIN
SELECT CLEFT,CRIGHT,CLEVEL FROM CAT WHERE CID=:C_ID
INTO :CLEFT,:CRIGHT,:CLEVEL;
SUSPEND;
END



CREATE PROCEDURE INSERT_NODE (
CID INTEGER,
TITLE VARCHAR (254),
CTYPE CHAR (1))
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
DECLARE VARIABLE new_LE INTEGER;
DECLARE VARIABLE new_RI INTEGER;
DECLARE VARIABLE new_LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
new_LE = RI;
new_RI = RI+1;
new_LL = LL+1;

UPDATE CAT
SET cleft = cleft + 2,
cright = cright + 2
WHERE cleft > :RI;
UPDATE CAT
SET cright = cright + 2
WHERE cright >= :RI AND cleft < :RI;
INSERT INTO CAT (CLEFT,CRIGHT,CLEVEL,TITLE,CTYPE)
VALUES:)new_LE,:new_RI,:new_LL,:TITLE,:CTYPE);
END


CREATE PROCEDURE DELETE_NODE (
CID INTEGER)
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
DELETE FROM CAT WHERE CID=:CID;

UPDATE CAT SET cright = cright - :)RI - :LE + 1) WHERE cright > :RI AND cleft < :LE;
UPDATE CAT SET cleft = cleft - :)RI - :LE + 1), cright = cright - :)RI - :LE + 1) WHERE cleft > :RI;
END
 
Сверху