2012-07-24 59 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