Closing Gaps in Celko trees
Hi All
Im trying to convert one of the functions the Celko wrote for closing gaps
in lft,rgt tree type.
The function return me: ERROR: parser: parse error at or near "while"
Any ideas ?
# This is Celko sample from book
BEGIN
WHILE EXISTS ( SELECT * FROM gaps )
LOOP UPDATE frammis
SET rgt = CASE WHEN rgt > ( SELECT MIN(start) FROM gaps )
THEN rgt - 1 ELSE rgt END,
lft = CASE WHEN lft > ( SELECT MIN(start) FROM gaps )
THEN lft - 1 ELSE lft END;
END WHILE;
# This is me trying to covert it to PG
CREATE FUNCTION close_gaps() RETURNS TEXT AS '
DECLARE
right_most_sibling INTEGER;
BEGIN
WHILE EXISTS ( SELECT * FROM gaps )
LOOP UPDATE tree
SET rgt = CASE
WHEN rgt > ( SELECT MIN(start) FROM gaps )
THEN rgt - 1 ELSE rgt END,
lft = CASE
WHEN lft > ( SELECT MIN(start) FROM gaps )
THEN lft - 1 ELSE lft END;
END WHILE;
RETURN NEW;
END;'
LANGUAGE 'plpgsql';
"Ben-Nes Michael" <miki@canaan.co.il> writes:
WHILE EXISTS ( SELECT * FROM gaps )
...
END WHILE;
The docs show a different syntax for plpgsql's WHILE loops:
WHILE expression LOOP
statements
END LOOP;
regards, tom lane
Im trying to convert one of the functions the Celko wrote for closing gaps
in lft,rgt tree type. <<
I have a better way now:
CREATE VIEW LftRgt (i)
AS SELECT lft FROM Tree
UNION ALL
SELECT rgt FROM Tree;
UPDATE Tree
SET lft = (SELECT COUNT(*)
FROM LftRgt
WHERE i <= lft),
rgt = (SELECT COUNT(*)
FROM LftRgt
WHERE i <= rgt);