Подтвердить что ты не робот

Функция с SQL-запросом не имеет назначения для данных результата

Я пытаюсь создать функцию, которая возвращает SELECTed resultset. Когда я вызываю функцию postgres, такую ​​как select * from tst_dates_func(), я получаю сообщение об ошибке, как показано ниже:

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 "tst_dates_func" line 3 at SQL statement

********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "tst_dates_func" line 3 at SQL statement

Вот созданная мной функция:

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;
END;
$BODY$
      LANGUAGE plpgsql;

Я не уверен, почему я получаю вышеуказанную ошибку. Я хотел бы запустить select * from tst_dates_func(); и вернуть данные. Или, если необходимо, присоедините к набору результатов. В чем проблема?

4b9b3361

Ответ 1

Сделайте это как простой SQL

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;

$BODY$
      LANGUAGE sql;

Если вам действительно нужно использовать plpgsql return query

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    perform SELECT dblink_connect('remote_db');
    return query
    select a.date_value, a.date_id, a.date_desc from dates_tbl a;

END;
$BODY$
      LANGUAGE plpgsql;

Ответ 2

У меня та же проблема с моим кодом ниже. Кто-нибудь может помочь?

CREATE OR REPLACE FUNCTION public.faq_sc13_rate()
RETURNS real
AS $function$
BEGIN
    select
        sum(stock_rate.s13)/sum(stock_rate.weight) as s13_rate,
        sum(stock_rate.weight) as weight
    from
        (
            select ss.init_qty as weight,
                ss.init_qty*ss.screen13 as s13,
                -- ss.init_qty*screen16 as s16,
                -- ss.init_qty*(screen18+screen19+screen20) as s18
            from stock_stack ss
            join product_product pp on pp.id = ss.product_id

            where ss.init_qty > 0 and pp.default_code = 'FAQ'
            ) as stock_rate;
     return stock_rate.s13_rate*stock_rate.weight/100*0.95;
end;
$function$
LANGUAGE plpgsql;

Ответ 3

In PLPGSQL - use RETURN QUERY

CREATE OR REPLACE FUNCTION tst_dates_func() 
    RETURNS TABLE( date_value date, date_id int, date_desc varchar) as
$BODY$   
BEGIN
    RETURN QUERY (select a.date_value, a.date_id, a.date_desc from dates_tbl a);
END;
$BODY$
    LANGUAGE plpgsql;