2012-07-24 3 views
0

다음 plpgsql 함수는 8.3 및 8.3에서 훌륭하게 작동하지만 8.1 데이터베이스로 다시 변환해야하며 올바른 결과를 얻기 위해 솔기를 잡을 수 없습니다.plpgsql 재귀 함수를 pg8.1로 변환

팁이 있습니까? 나는

CREATE OR REPLACE FUNCTION specie_children (specie_id INT, self BOOLEAN) 
     RETURNS SETOF specie AS 
    $BODY$ 
    DECLARE 
     r specie%ROWTYPE; 
    BEGIN 
     IF self THEN 
     RETURN QUERY SELECT * FROM specie WHERE specieid = specie_id; 
     END IF; 
     FOR r IN SELECT * FROM specie WHERE parent = specie_id 
     LOOP 
     RETURN NEXT r; 
     RETURN QUERY SELECT * FROM specie_children(r.specieid, FALSE); 
     END LOOP; 
     RETURN; 
    END 
    $BODY$ 
    LANGUAGE 'plpgsql'; 

어떻게이 번역 할 ... 그것은 아직 8.1에 소개되지 않은 것처럼 "RETURN QUERY"없애해야합니까?

+0

월 http://stackoverflow.com/questions/53108/is-it-possible-to-make-a-recursive-sql-query – Luxspes

+2

8.1이 죽었고 지원되지 않는다는 사실을 알고 계십니까? 그리고 8.3은 곧 나올 것입니다. 정말로 현재 버전으로 이동해야합니다. –

+0

'specie_children'으로'specie'로 이미하는 일을하십시오. 형식이 어쨌든 일치해야하므로 동일한 변수를 사용할 수도 있습니다. –

답변

1
RETURN QUERY SELECT * FROM specie_children(r.specieid, FALSE); 

for r2 in select * from specie_children(r.specieid, FALSE) 
loop 
    return next r2 
end loop 
+0

다음과 같은 오류가 발생합니다. 집합을 허용 할 수없는 컨텍스트에서 호출 된 집합 값 함수 – user87400

+0

@ user87400 :이 예에서는 위의 예와 같이 함수를 호출해야합니다. 'SELECT * FROM ... ' –

+0

WHOOPS, 그래서 thats는 결국 내 문제였습니다 ;-) 도움을 청합니다! – user87400

0

빠른 데모로 다시 작성할 수 있습니다. 기본적으로 @maniek은 이미 답변을 제공했습니다.

테스트 테이블 :

CREATE TEMP TABLE specie(specieid int, parent int); 
INSERT INTO specie VALUES 
(1,0), (2,0), (3,0) 
,(11,1), (12,1), (13,1) 
,(111,11), (112,11), (113,11); 

재 작성 기능 :

CREATE OR REPLACE FUNCTION specie_children (specie_id INT, self BOOLEAN) 
    RETURNS SETOF specie AS 
$BODY$ 
DECLARE 
    r specie%ROWTYPE; 
BEGIN 
IF self THEN 
    FOR r IN SELECT * FROM specie WHERE specieid = $1 
    LOOP 
     RETURN NEXT r; 
    END LOOP; 
END IF; 

FOR r IN SELECT * FROM specie WHERE parent = $1 
LOOP 
    RETURN NEXT r; 
    FOR r IN SELECT * FROM specie_children(r.specieid, FALSE) 
    LOOP 
     RETURN NEXT r; 
    END LOOP; 
END LOOP; 

RETURN; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

전화 :

SELECT * FROM specie_children (1, true); 

결과 :

specieid | parent 
---------+------- 
1  | 0 
11  | 1 
111  | 11 
112  | 11 
113  | 11 
12  | 1 
13  | 1