#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. Ошибка была в схеме, я не указал имя столбцов с префиксом схемы. Спасибо.