用于返回节点所有子表的函数

问题描述 投票:1回答:3

假设我具有以下表结构:

| ID | ParentID | Name |

我想编写一个递归的PostgreSQL函数,以获取节点ID的所有子节点作为参数传递给它。

到目前为止,这是我的代码(我只有一部分函数可以获取传递的ID的所有子代,现在我需要递归部分:]]

CREATE OR REPLACE FUNCTION GetAllChildren(IN NodeID INTEGER) RETURNS INTEGER AS $$
DECLARE
    Crs CURSOR FOR SELECT ID, ParentID, Name FROM Tree WHERE ParentID=NodeID;
    VarRow Tree%ROWTYPE;
BEGIN
    OPEN Crs;

    CREATE TEMPORARY TABLE TBL(
        ID SERIAL,
        ParentID INTEGER,
        Name CHARACTER(100)
    );

    LOOP
        FETCH Crs INTO VarRow;
        IF VarRow IS NULL THEN
            EXIT;
        END IF;
        INSERT INTO TBL(ID, ParentID, Name) VALUES(VarRow.ID, VarRow.ParentID, VarRow.Name);
    END LOOP;

    CLOSE Crs;

    RETURN 0;
END;
$$ LANGUAGE plpgsql;

也许最大的问题是我不知道在两次递归调用之间将输出保存到哪里。

如果到目前为止还没有弄清楚,那就是邻接表,获取节点的所有子代并将它们打印到表中。

有人有解决方案吗?

假设我具有以下表结构:| | ID | ParentID |姓名|我想编写一个递归的PostgreSQL函数,以获取节点ID的所有子节点作为参数传递给它。 ...

function postgresql recursion plpgsql children
3个回答
0
投票

是。它位于PostgreSQL wiki中,它首先被命中google


4
投票

有关信息,Postgres中有一些常用的表表达式,在这里可能会有所帮助:


4
投票
  • PostgreSQL不知道本地(过程)受限的临时表-您的临时表在所有被调用函数的实例中都是可见的,并且在您的函数之外也将是可见的-它具有会话可见性。

© www.soinside.com 2019 - 2024. All rights reserved.