如何在 Postgresql 中 return 多个 INSERTED ID?

How to return multiple INSERTED ID's in Postgresql?

我有一个函数有两个参数,第一个是整数,第二个是 varchars 数组。

我只想插入之前没有为活动插入的哈希,然后 return 插入的 ID — 在本例中,campaigns_urlsurl_hash 字段table — 但我不断收到以下错误:

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. 如果 returns 超过一行,则应在 RETURNS.

  2. 之后使用 SETOF 关键字
  3. 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,) g(v)
          returning a;
    end;
    $$ language plpgsql;
    
    postgres=# select * from foo(3);
    ┌─────┐
    │ foo │
    ╞═════╡
    │   1 │
    │   2 │
    │   3 │
    └─────┘
    (3 rows)