Как я могу вернуть результат запроса в Postgres?

#sql #postgresql #plpgsql

#sql #postgresql #plpgsql

Вопрос:

У меня есть функция в PostgreSQL, когда я хочу вернуть результаты, я получил ошибку :

     ERROR:  query has no destination for result data
    HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
  

Вот краткое изложение моей функции (слишком долго копировать / вставлять весь код здесь)

 CREATE OR REPLACE FUNCTION "schema"."test"(IN Id int8,)

 RETURNS TABLE("Id" uuid, "SiteId" uuid, "Domain" varchar,
 "JumpCost" numeric, "CPMCost" numeric, "PaymentModel" int8, "ComputedEpm" numeric,
 "ClickedCampaignId" int8, "MainRubricId" int8, "ShowSlider" bool,
 "ShowGoods" bool, "ShowTeaser" bool, "BidLimitCoeff" numeric,
 "RtbActiveSiteStatByBannerId" int8, "ShowType" int8, "MinAge" int8) AS

$BODY$

DECLARE
     rtbCampaignEpmCoeff NUMERIC(18,6);
     maxRubricShows int;   
     showsRubricAddedPerClick int;
     siteLossLimitPerRubric NUMERIC(18,6);
     rtbMinRubricVisitsToShow int;
     showAdsToUsersWithoutInterests boolean;

BEGIN
......

DO
$do$
......
$do$;

PERFORM   "Id", "SiteId", "Domain", "JumpCost", "CPMCost", "PaymentModel",
5 as ComputedEpm, "ClickedCampaignId", "MainRubricId", "ShowSlider", 
"ShowGoods", "ShowTeaser", "BidLimitCoeff", "RtbActiveSiteStatByBannerId",
"ShowType", "MinAge" 

FROM mytable

ORDER BY "FromClick" DESC, "Similarity" DESC, "rn", random()
LIMIT 1;

END;

$BODY$
LANGUAGE plpgsql
COST 100
CALLED ON NULL INPUT
SECURITY INVOKER
VOLATILE;
  

Как вы видите, я использовал «ВЫПОЛНИТЬ» для возврата результатов, но не удалось с ошибкой, которую я объяснил.

Кроме того, я использовал «Return query ..» и получил ту же ошибку.

«mytable» — это временная таблица, которую я создал в функции.

Как я могу вернуть этот результат?

Комментарии:

1. Вы хотите return query . Подробности см. В руководстве, там все объяснено: postgresql.org/docs/current/static/… Не связано, но: вам действительно следует избегать этих страшных идентификаторов в кавычках, с ними гораздо больше проблем, чем они того стоят.

2. Почему вы используете DO анонимный блок кода, когда вы уже находитесь внутри функции?

3. Одна из ваших проблем заключается в том, что вы используете одни и те же имена для выходных параметров и столбцов таблицы, которые хотите вернуть. Это приводит к конфликтам имен и неожиданным ошибкам, которые трудно отлаживать. Избегайте этого, называя выходные параметры по-другому, например p_id , и p_siteid . И, кстати, избегайте имен в верхнем и смешанном регистре, где это возможно.

Ответ №1:

может быть, что-то вроде этого?

 CREATE OR REPLACE FUNCTION my_function(user_id integer)
  RETURNS TABLE(id integer, firstname character varying
                          , lastname  character varying) AS
$$
DECLARE
    ids character varying;
BEGIN
    ids := '';

    --Some code which build the ids string, not interesting for this issue

    RETURN QUERY EXECUTE 'SELECT users.id, users.firstname, users.lastname
    FROM public.users WHERE ids IN (' || ids || ')';
END;
$$ LANGUAGE plpgsql;
  

Комментарии:

1. Я упоминал, что я пытался выполнить ОБРАТНЫЙ ЗАПРОС!

2. Да, но вы не показали код. RETURN QUERY в этом случае работает нормально, возможно, вы где-то допустили ошибку.

3. Ошибка была в схеме, я не указал имя столбцов с префиксом схемы. Спасибо.