Как вставить несколько строк в postgresql с помощью CTE (WITH) - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь написать функцию, которая получает массив идентификаторов (posts),
и вставьте их все в другой стол (offer).
Мне нужны идентификаторы из вновь созданных строк (offers) для дальнейшей обработки позже.

Я получаю ошибку, используя WITH

create function foo (post_ids text[])
returns text[]
as $$
  with
  offer_ids as (insert into app.offer (user_email, post_id)
                  values ('a@a.com', unnest(foo.post_ids))
                  returning id),
  ...
  select array_agg(id) from offer_ids;
$$ language sql security definer;

Error

ERROR:  more than one row returned by a subquery used as an expression

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

1 Ответ

3 голосов
/ 23 апреля 2019

Я не думаю, что ошибка исходит от части CTE, но от части INSERT. Набор возвращающих функций, таких как unnest, должен использоваться как часть инструкции SELECT:

with offer_ids as (
     insert into app.offer (user_email, post_id)
     select 'a@a.com', f.pid
     from unnest(foo.post_ids) as f(pid)
     returning id
),
...
select array_agg(id) 
from offer_ids;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...