2013-03-01 3 views
1

Я пишу рекурсивную функцию PostgreSQL, которая возвращает набор записей, но я не знаю их правильного синтаксиса. Рекурсивный таблица здесь Vertical, которая содержит ниже столбцов:Рекурсивная функция PostgreSQL возвращает набор записей

CREATE TABLE vertical 
(
    id serial NOT NULL, 
    name character varying(100) NOT NULL, 
    insert_timestamp timestamp without time zone NOT NULL DEFAULT now(), 
    deleted smallint NOT NULL DEFAULT 0, 
    parent_id integer, // refer to another Vertical 
    locations character varying(200), 
    level smallint NOT NULL DEFAULT 1, 
    CONSTRAINT vertical_pkey PRIMARY KEY (id), 
    CONSTRAINT vertical_parent_fkey FOREIGN KEY (parent_id) 
     REFERENCES vertical (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT name_ukey UNIQUE (name) 
) 

Вот мой SQL заявление (получить все Чайлдсы из вертикальных по указанному идентификатору):

CREATE FUNCTION getAllVerticalChilds(verticalId integer) RETURNS SETOF RECORD AS 
$BODY$ 
BEGIN 
    WITH RECURSIVE childs(id, name, parent_id, level) AS (
    SELECT child.id, child.name, child.parent_id, child.level 
    FROM vertical child 
    WHERE child.parent_id = verticalId 
    UNION ALL 
    SELECT parent.id, parent.name, parent.parent_id, parent.level 
    FROM childs child 
    INNER JOIN vertical parent ON parent.parent_id = child.id where parent.deleted=0 
    ) 
    SELECT id, name, parent_id, level 
    FROM childs; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

Не могли бы вы помочь мне исправить это? Спасибо огромное!

ответ

5

В postgresql вы должны использовать инструкцию RETURN, если вы можете нажать некоторые из функции. В вашем случае, вероятно, RETURN QUERY ...

BEGIN 
    RETURN QUERY WITH RECURSIVE ... 
END 

и использование вашей функции будет гораздо более удобной для пользователей, если вы объявить функцию как функция TABLE

CREATE OR REPLACE FUNCTION xx(..) RETURNS TABLE(a int, b int, ...) 

каждое использование этой функции (PostgreSQL не имеет оператора CALL)

SELECT * FROM xx(..)