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

How to use a recursive query inside of a function?

我在 returns .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 语句中。

table 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 以在函数中使用递归查询,但少数结果证明无效。

如果有任何帮助,我将不胜感激。

您的函数没有 return 任何东西。您至少需要一个 return query,但使用 language sql 函数来封装查询更有效:

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;