Функции в SQL, который возвращает таблицу (Postgres SQL) - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующий запрос, который возвращает мне таблицу:

WITH RECURSIVE EXPL (parent_node, node, filename) AS
     (
      SELECT ROOT.parent_node, ROOT.node, ROOT.filename
      FROM   filesystem   ROOT
      WHERE  ROOT.parent_node = 1

      UNION ALL

      SELECT CHILD.parent_node, CHILD.node, CHILD.filename
      FROM   EXPL PARENT, filesystem CHILD
      WHERE  PARENT.node = CHILD.parent_node
     )

     SELECT   DISTINCT parent_node, node, filename
     FROM     EXPL
     ORDER BY parent_node, node;
END

Но я хочу функцию, которая заменяет WHERE ROOT.parent_node = 1 на WHERE ROOT.parent_node = x.X - это целое число, являющееся параметром функции.

Я думал об этом, но это совсем не правильно:

CREATE FUNCTION childs(x INT) RETURNS TABLE 
RETURN
WITH RECURSIVE EXPL (parent_node, node, filename) AS
     (
      SELECT ROOT.parent_node, ROOT.node, ROOT.filename
      FROM   filesystem   ROOT
      WHERE  ROOT.parent_node = x

      UNION ALL

      SELECT CHILD.parent_node, CHILD.node, CHILD.filename
      FROM   EXPL PARENT, filesystem CHILD
      WHERE  PARENT.node = CHILD.parent_node
     )

     SELECT   DISTINCT parent_node, node, filename
     FROM     EXPL
     ORDER BY parent_node, node;
END;

1 Ответ

0 голосов
/ 27 мая 2018

В определении вашей функции отсутствовали BEGIN & a QUERY после RETURN

CREATE OR REPLACE FUNCTION childs(x int) 
RETURNS TABLE (parent_node integer, node integer, filename varchar(255)) AS
$function$
BEGIN 
RETURN QUERY
WITH RECURSIVE expl (parent_node, node, filename) AS
     (
      SELECT root.parent_node, root.node, root.filename
      FROM   filesystem   root
      WHERE  root.parent_node = x

      UNION ALL

      SELECT child.parent_node, child.node, child.filename
      FROM   expl parent, filesystem child
      WHERE  parent.node = child.parent_node
     )

     SELECT   DISTINCT expl.parent_node, expl.node, expl.filename
     FROM     expl
     ORDER BY parent_node, node;
END 
$function$ LANGUAGE plpgsql;

Используйте функцию следующим образом:

SELECT * FROM childs(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...