假设我具有以下表结构:
| 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的所有子节点作为参数传递给它。 ...
是。它位于PostgreSQL wiki中,它首先被命中google。
有关信息,Postgres中有一些常用的表表达式,在这里可能会有所帮助:
PostgreSQL不知道本地(过程)受限的临时表-您的临时表在所有被调用函数的实例中都是可见的,并且在您的函数之外也将是可见的-它具有会话可见性。