2012-07-24 55 views
0

我有以下plggsql函數,它在pg 8.3及更高版本上工作良好,但我需要將其轉換回pg 8.1數據庫,並且我無法縫合才能正確使用它。將plpgsql遞歸函數轉換回pg8.1

任何提示?我需要擺脫「返回查詢」,因爲它尚未在8.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'; 

我該如何翻譯?

+0

五月與此:http://stackoverflow.com/questions/53108/is-it-possible-to-make-a-recursive-sql-query – Luxspes 2012-07-24 10:02:24

+2

你知道8.1已經死了,不受支持? 8.3即將推出。你應該真的轉向當前的版本。 – 2012-07-24 10:32:51

+0

只要用'specie_children'做你已經用'specie'做了什麼。你甚至可以使用相同的變量,因爲類型必須匹配。 – 2012-07-24 13:06:28

回答

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 2012-07-24 13:41:24

+0

@ user87400:您必須按照我在示例中顯示它的方式調用您的函數, 'SELECT * FROM ...' – 2012-07-24 13:48:33

+0

WHOOPS,所以這是我的問題畢竟;-) thx的幫助! – user87400 2012-07-24 14:03:33

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