2013-03-01 5 views
1

레코드 세트를 반환하는 PostgreSQL 재귀 함수를 작성하고 있지만 올바른 구문을 모르겠습니다.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 문 (특정 ID로 수직의 모든 차일을 얻기가)됩니다 :

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 문을 사용해야합니다. 당신이 테이블 함수로 함수를 선언하는 경우 귀하의 경우에는 아마 (이 기능의 사용법은

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

훨씬 더 사용자 친화적 인 것입니다 ...

BEGIN 
    RETURN QUERY WITH RECURSIVE ... 
END 

와 함수의 사용을 QUERY를 반환 PostgreSQL에는 CALL 문이 없습니다.

SELECT * FROM xx(..)