Как вернуть несколько INSERTED ID в Postgresql? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть функция, которая принимает два аргумента, первый из которых является целым числом, а второй - массивом varchars.

Я хочу вставить только те хэши, которые ранее не вставлялись для кампаниии затем вернуть вставленные идентификаторы - в данном случае это поле url_hash таблицы campaigns_urls - но я получаю следующую ошибку:

ERROR:  column "hash" does not exist LINE 10:  RETURNING "hash"
                    ^ 
HINT:  There is a column named "hash" in table "*SELECT*", but it cannot be referenced from this part of the query.

Я вызываю функцию, подобную этой:

-- SELECT * FROM assign_urls_to_campaign(1,'{Xelgb20Lw}')

CREATE OR REPLACE FUNCTION public.assign_urls_to_campaign(
    param_campaign_id integer,
    param_hashes character varying(20)[]
)
    RETURNS character varying(20)
    LANGUAGE 'plpgsql'
    VOLATILE
AS $BODY$
BEGIN

    INSERT INTO campaigns_urls ("campaign_id", "url_hash") 
    SELECT
        param_campaign_id as "id", "P"."hash"
    FROM "urls" AS "U"
    RIGHT OUTER JOIN (
        SELECT hash FROM UNNEST(param_hashes) AS "hash"
    ) AS "P"
    ON "U"."hash" = "P"."hash"
    WHERE "U"."hash" ISNULL
    RETURNING "hash";

END;
$BODY$;

1 Ответ

0 голосов
/ 11 декабря 2018

Есть еще проблемы:

  1. Если функции возвращают более одной строки, то следует использовать SETOF ключевые слова после RETURNS.

  2. Для функций PlpgSQL требуется оператор RETURN - в данном случае RETURN QUERY.

    create table test(a int);
    
    create or replace function foo(int)
    returns setof int as $$
    begin
      return query
        insert into test 
          select v from generate_series(1,$1) g(v)
          returning a;
    end;
    $$ language plpgsql;
    
    postgres=# select * from foo(3);
    ┌─────┐
    │ foo │
    ╞═════╡
    │   1 │
    │   2 │
    │   3 │
    └─────┘
    (3 rows)
    
...