Обсуждение: Closing Gaps in Celko trees

Поиск
Список
Период
Сортировка

Closing Gaps in Celko trees

От
"Ben-Nes Michael"
Дата:
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';



Re: Closing Gaps in Celko trees

От
Tom Lane
Дата:
"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

Re: Closing Gaps in Celko trees

От
71062.1056@compuserve.com (--CELKO--)
Дата:
>> 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);