0

pg 8.3以降でうまく機能する次のplpgsql関数がありますが、それをpg 8.1データベースに変換する必要があり、それを正しくするために縫い合わせることができません。

任意のヒント?「RETURN QUERY」は 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';

これをどのように翻訳しますか?

4

2 に答える 2

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
于 2012-07-24T10:06:23.713 に答える
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
于 2012-07-24T13:41:30.070 に答える