Как запускать запросы SELECT в операторах PL / pgSQL IF - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь выполнить запросы SELECT в операторах PL / pgSQL IF, используя следующий код:

DO
$do$
DECLARE
    query_type   real;
    arr real[] := array[1];
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSE IF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END
$do$

Однако я получаю следующую ошибку, ERROR: cannot use RETURN QUERY in a non-SETOF function.

Кто-нибудь знает, как мне заставить работать приведенный выше код? Спасибо.

ОБНОВЛЕНИЕ: Это сработало для меня:

CREATE OR REPLACE FUNCTION my_function(query_type integer)
RETURNS SETOF "Westminster" LANGUAGE plpgsql as $$
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSIF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END;
$$;

Затем я вызвал функцию следующим образом:

SELECT * FROM my_function(1);

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

С документация:

Кодовый блок обрабатывается так, как если бы это было тело функции без параметров, возвращая void.

Вы можете использовать RETURN QUERY только в функции, возвращающей SETOF <type> или TABLE(...).Используйте таблицу "Westminster" в качестве результирующего типа, например:

CREATE OR REPLACE FUNCTION my_function(query_type int)
RETURNS SETOF "Westminster" LANGUAGE plpgsql as $$
BEGIN
    IF query_type = 1 THEN
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster"
        WHERE ("Westminster".intersects = false AND "Westminster".area <= 100);
    ELSIF query_type = 0 THEN 
        RETURN QUERY
        SELECT "Westminster".*
        FROM "Westminster";
    END IF;
END;
$$;

-- exemplary use:

SELECT * FROM my_function(1); 

Обратите внимание на правильное использование ELSIF.

0 голосов
/ 26 июня 2018

Я не думаю, что anonymous code blocks поддерживают это. Попробуйте создать функцию и задать для ее набора результатов значение table, например:

CREATE OR REPLACE FUNCTION myfunc() RETURNS TABLE (val INT) AS $$
BEGIN
  RETURN QUERY SELECT 1;
END;
$$ LANGUAGE plpgsql;

Для вызова вашей функции вы можете использовать:

SELECT * FROM myfunc();

Примечание: имейте в виду, что таблица, объявленная в заголовке функции, должна иметь те же поля, которые возвращены в операторе RETURN QUERY.

...