如何在函数内部使用递归查询?

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

我下面有一个有效的递归函数,它返回.Net元素的层次结构,在此示例中为'ImageBrush'

    WITH RECURSIVE r AS (
    SELECT id, name, dependent_id, 1 AS level
    FROM dotNetHierarchy
    WHERE name = 'ImageBrush'
    UNION ALL
    SELECT g.id, lpad(' ', r.level) || g.name, g.dependent_id, r.level + 1
    FROM dotNetHierarchy g JOIN r ON g.id = r.dependent_id
    )
    SELECT name FROM r;

现在我想在函数内部使用它,其中输入是诸如'ImageBrush'之类的文本,该文本将插入到递归查询的WHERE语句中。

表dotNetHierarchy具有3列:id,name,dependent_id

以下内容与PgAdmin一起使用,只是永远无误地进行查询:

    CREATE OR REPLACE FUNCTION get_hierarchy(inp text) RETURNS 
    TABLE (id int, name text, id int, lev int) AS
    $BODY$
    DECLARE
    BEGIN
        WITH RECURSIVE r AS (
        SELECT id, name, dependent_id, 1 AS level
        FROM dotNetHierarchy
        WHERE name = inp
      UNION ALL
        SELECT g.id, lpad(' ', r.level) || g.name, g.dependent_id, r.level + 1
        FROM dotNetHierarchy g JOIN r ON g.id = r.dependent_id
        )

        SELECT name FROM r;
        return;
    END
    $BODY$
    LANGUAGE plpgsql;

我曾尝试在Google中搜索在函数中使用递归查询的方法,但事实证明少数结果无效。

感谢您的帮助,谢谢。

postgresql recursion plpgsql stored-functions
1个回答
0
投票
CREATE OR REPLACE FUNCTION get_hierarchy(inp text) RETURNS TABLE (id int, name text, id int, lev int) AS $BODY$ WITH RECURSIVE r AS ( SELECT id, name, dependent_id, 1 AS level FROM dotNetHierarchy WHERE name = inp UNION ALL SELECT g.id, lpad(' ', r.level) || g.name, g.dependent_id, r.level + 1 FROM dotNetHierarchy g JOIN r ON g.id = r.dependent_id ) SELECT name FROM r; $BODY$ LANGUAGE sql;
© www.soinside.com 2019 - 2024. All rights reserved.