Вопрос:
Я пытаюсь создать функцию, которая возвращает 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();
и вернуть данные. Или, если необходимо, присоедините к набору результатов. В чем проблема?
Лучший ответ:
Сделайте это как простой 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; Ответ №1
У меня та же проблема с моим кодом ниже. Кто-нибудь может помочь?
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; Ответ №2In 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;