Я вижу два разных решения:
Сначала упростим вашу функцию до функции SQL:
CREATE OR REPLACE FUNCTION update_on_conflict (_a integer, _b integer)
RETURNS TABLE (a integer, b integer) AS
$body$
INSERT INTO table_on_conflict (a, b)
values (_a, _b)
ON CONFLICT (a) DO UPDATE
SET b = EXCLUDED.b
returning *;
$body$
LANGUAGE sql;
Если вам нужен PL / pgSQL (потому что у вас есть другой код, который выне показывал нам), вы можете объявить функцию как RETURNS setof table_on_conflict
CREATE OR REPLACE FUNCTION update_on_conflict (_a integer, _b integer)
RETURNS setof table_on_conflict
AS
$body$
begin
return query
INSERT INTO table_on_conflict (a, b)
values (_a, _b)
ON CONFLICT (a) DO UPDATE SET b = EXCLUDED.b
returning *;
end;
$body$
LANGUAGE plpgsql;
Отдельный select
не нужен ни в коем случае.Вы можете напрямую вернуть результат оператора INSERT.
Не связано, но: название языка является идентификатором.Не заключайте его в одинарные кавычки.