【发布时间】:2013-06-25 19:54:12
【问题描述】:
假设我有以下表结构:
| 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;
也许最大的问题是我不知道在递归调用之间将输出保存在哪里。
如果你到目前为止还没有弄清楚,那就是邻接列表,获取节点的所有子节点并将它们打印到表中。
有人有解决办法吗?
【问题讨论】:
标签: function postgresql recursion plpgsql children