Как вернуть набор строк cte, определенных в функции? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть функция, которая должна возвращать всех детей определенного родителя в таблицу отношений менеджер-работник.

У меня есть CTE, который определяет рекурсивность работающей проблемы, но чтобы позволить выбрать любого родителя, я вложил CTE в функцию.Она создает функцию, но когда я вызываю ее, я получаю сообщение об ошибке: у запроса нет места назначения для данных результата

CREATE OR REPLACE FUNCTION  display_full_cat(
    PROCURA VARCHAR
)
    RETURNS SETOF (categoria varchar, super_categoria varchar) AS $BODY$
    BEGIN
        WITH RECURSIVE HIERARQUIA AS (
        SELECT C.CATEGORIA, C.SUPER_CATEGORIA
        FROM CONSTITUIDA C
        WHERE C.SUPER_CATEGORIA = PROCURA
        UNION
        SELECT C.CATEGORIA, C.SUPER_CATEGORIA
        FROM CONSTITUIDA C
        INNER JOIN HIERARQUIA H ON H.CATEGORIA = C.SUPER_CATEGORIA
    ) SELECT * FROM HIERARQUIA;

    RETURN QUERY
        SELECT * FROM HIERARQUIA;
    RETURN;

    END
    $BODY$  LANGUAGE PLPGSQL;

ПРИМЕЧАНИЕ. CONSTITUIDA - это отношение, которое содержит отношение родительский-дочерний элемент, то есть соответственно super_categoria иКатегория.

Для данных

super_categoria | categoria
Organism        | Plant
Organism        | Animal
Animal          | Lion
Animal          | Cat
Plant           | Apple
Rock            | Obsidian

Результат должен быть

super_categoria | categoria
Organism        | Plant
Organism        | Animal
Animal          | Lion
Animal          | Cat
Plant           | Apple

Но вместо этого я получаю сообщение об ошибке:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function display_full_cat(character varying) line 3 at SQL statement

1 Ответ

0 голосов
/ 13 мая 2019

У вас RETURN QUERY в неправильном месте.Это должно быть на вершине CTE.Вы уже используете SELECT * FROM HIERARQUIA; в конце CTE, поэтому последний запрос, который вы пытаетесь вернуть, является дубликатом.Вы получаете сообщение об ошибке из-за того, что SELECT в конце CTE не сохраняется и никуда не возвращается.

CREATE OR REPLACE FUNCTION  display_full_cat(PROCURA VARCHAR)
RETURNS SETOF (categoria varchar, super_categoria varchar) 
AS $BODY$
BEGIN
    RETURN QUERY -- This will return the result from the last query in the CTE.
    WITH RECURSIVE HIERARQUIA 
    AS (
        SELECT C.CATEGORIA, C.SUPER_CATEGORIA
        FROM CONSTITUIDA C
        WHERE C.SUPER_CATEGORIA = PROCURA
        UNION
        SELECT C.CATEGORIA, C.SUPER_CATEGORIA
        FROM CONSTITUIDA C
        JOIN HIERARQUIA H ON H.CATEGORIA = C.SUPER_CATEGORIA
    ) SELECT * FROM HIERARQUIA; -- Prior to moving RETURN QUERY, this was causing the error
END;
$BODY$  LANGUAGE PLPGSQL;
...