ОШИБКА: запрос не имеет назначения для данных результатов

Я пытаюсь создать такую ​​​​функцию:

Я попытался изменить тип возвращаемого значения на int или text и т. д., чтобы увидеть, работает ли код вне этого, но это не так. Я новичок в PostgreSQL, поэтому не судите строго, если я пропустил что-то очевидное.

create or replace function date_select(i INT) returns void as
$$ 
    begin
        select * from dwh_stg.stg_dce_gift where gift_id = i;
    end
$$ language plpgsql

select date_select(16940)

Ошибка SQL [42601]:

ERROR: query has no destination for result data
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Where: PL/pgSQL function date_select(integer) line 3 at SQL statement

person bilgecany    schedule 05.07.2019    source источник
comment
Что вы пытаетесь реализовать? Функция, возвращающая void. . . в данной ситуации необычно. Образцы данных и желаемые результаты помогут.   -  person Gordon Linoff    schedule 05.07.2019


Ответы (1)


Если вы хотите что-то вернуть, вам нужно определить функцию для возврата чего-то (не void)

Очевидно, вы хотите вернуть несколько строк из таблицы stg_dec_gift, для этого вам нужно определить функцию как returns setof dwh_stg.stg_dce_gift. Для простой функции, инкапсулирующей запрос, нет необходимости использовать PL/pgSQL, вполне подойдет обычная функция SQL:

create or replace function date_select(i INT) 
  returns setof dwh_stg.stg_dce_gift --<<  here
as
$$ 
  select * 
  from dwh_stg.stg_dce_gift 
  where gift_id = i;
$$ 
stable
language sql;

Затем используйте его в части FROM:

select *
from date_select(16940);

Онлайн-пример: https://rextester.com/WYDCE44062.

person a_horse_with_no_name    schedule 05.07.2019
comment
Я попробовал этот код и получил следующую ошибку: Ошибка SQL [42883]: ОШИБКА: функция date_select (целое число) не существует Подсказка: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явное приведение типов. Позиция: 15 - person bilgecany; 05.07.2019
comment
@bilgecany: в моем коде была опечатка, из-за которой функция не была создана. - person a_horse_with_no_name; 05.07.2019