【问题标题】:PL/pgSQL function taking argument and searching table recursivelyPL/pgSQL 函数以递归方式获取参数和搜索表
【发布时间】:2021-07-10 04:55:36
【问题描述】:

我是 PL/pgSQL 的新手。我们有一个 Postgres 11 数据库。

我需要一个函数,它将 1 个参数作为一个表的 ID,并在另一个表中进行递归搜索。它应该返回两列:id 和连接结果为text(或varchar)。

这是我的代码(更像是伪代码):

DROP FUNCTION IF EXISTS;
CREATE OR REPLACE FUNCTION my_awesome_func(AUID, UUID) RETURNS (RESULT TEXT) AS;
DECLARE RESULT TEXT;
BEGIN;
SELECT first_table.parent_uid FROM first_table WHERE first_table.auid = AUID; 
WITH RECURSIVE child_to_parents AS (
    SELECT second_table.* FROM second_table
        WHERE aoguid = first_table.parent_uid
    UNION ALL
    SELECT second_table.* FROM second_table.*, child_to_parents
        WHERE second_table.aoguid = child_to_parents.parentguid
            AND second_table.currstatus = 0
    )
END
    SELECT * FROM child_to_parents ORDER BY aolevel;

小提琴在这里:
https://dbfiddle.uk/?rdbms=postgres_11&fiddle=dfa2838ab11356cc08987d0931f7b8e5

【问题讨论】:

  • 不清楚函数应该返回什么。请添加first_tablesecond_table 创建包含数据和预期结果的脚本。
  • 请创建一个 Fiddle 以便我们了解您的问题:dbfiddle.uk/?rdbms=postgres_11
  • 小提琴准备好了。 dbfiddle.uk/… 谢谢。
  • 感谢您提供示例数据(尽管只有相关列的表就足够了 :-P),但仍然不清楚您要如何调用该函数以及您的结果是什么期望,或者您当前的代码有什么问题。
  • 小提琴中的查询与问题中的查询不一致。也不清楚要连接什么。

标签: postgresql plpgsql recursive-query


【解决方案1】:

你所说的函​​数可能看起来像这样:

CREATE OR REPLACE FUNCTION my_awesome_func(_auid uuid, OUT _ancestors text)
  LANGUAGE plpgsql AS
$func$
BEGIN
   WITH RECURSIVE child_to_parents AS (
      SELECT t1.auid, t1.parent_uid, 1 AS lvl
      FROM   first_table t1
      WHERE  t1.auid = _auid 

      UNION ALL
      SELECT c.auid, t2.parentguid, lvl + 1
      FROM   child_to_parents c
      JOIN   second_table t2 ON t2.aoguid = c.parent_uid
                            AND t2.currstatus = 0
      )
   SELECT string_agg(c.parent_uid::text, E'\n'  ORDER BY c.lvl)
   FROM   child_to_parents c
   INTO   _ancestors;
END
$func$;

在您的问题不清楚的地方填​​写假设。

普通查询不需要 PL/pgSQL 函数包装器。一个普通的 SQL 函数,或者只是简单的查询就可以了(可能更快)。

更多解释和链接的相关答案:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多