Как вернуть вновь созданный массив идентификаторов из функции Postgres? - PullRequest
0 голосов
/ 23 мая 2018

Я работаю над вставкой нескольких строк в таблицу, используя функцию postgres.Я должен вернуть все идентификаторы вставленных строк.

моя функция выглядит следующим образом

    CREATE OR REPLACE FUNCTION insert_multiple_rows(temp integer)
        RETURNS integer[]
        LANGUAGE 'plpgsql'
        VOLATILE
        PARALLEL UNSAFE
        COST 100
    AS $BODY$DECLARE
    company_ids_list integer[];
    BEGIN
    INSERT INTO company VALUES
    (default,now(),temp),
    (default,now(),temp),
    (default,now(),temp),
    (default,now(),temp)
     RETURNING id INTO company_ids_list;

    RETURN company_ids_list;
    END;
    $BODY$;

Когда я пытаюсь вызвать эту функцию, используя

 select insert_multiple_rows(58);

, получая ошибку

ERROR:  query returned more than one row
CONTEXT:  PL/pgSQL function create_company_budget_allocation(integer) 
line 4 at SQL statement
SQL state: P0003

1 Ответ

0 голосов
/ 23 мая 2018

SELECT .. INTO или INSERT ... RETURNING ... INTO могут заполнять только одну переменную.Если запрос возвращает более одной строки, вы получите сообщение об ошибке.

Вы можете использовать оператор INSERT в CTE и использовать array_agg для построения массива результатов:

WITH ins AS (
   INSERT INTO company VALUES
      (default,now(),temp),
      (default,now(),temp),
      (default,now(),temp),
      (default,now(),temp)
   RETURNING id)
SELECT array_agg(id) INTO company_ids_list
FROM ins;
...