在 plpgsql 函数中声明 setof bigint 的类型并分配给 from select union

Declare type of setof bigint in plpgsql function and assign into from select union

以下代码目前适用于 PostgreSQL 13.3(通过 Supabase.io)。函数 get_owned_base_idsget_bases_editable 的 return 类型都是 setof bigint:

CREATE FUNCTION get_owned_base_ids()
returns setof bigint
stable
language sql
as $$
  select id
  from bases
  where bases.owner_user_id = auth.uid();
$$;


-- CREATE FUNCTION get_bases_editable()
-- returns setof bigint
-- ... similar to get_owned_base_ids()
-- $$;


CREATE FUNCTION xyz (base_id bigint)
returns int
language plpgsql
as $$
BEGIN
  IF base_id not in (select get_owned_base_ids() UNION select get_bases_editable()) THEN
    -- note: actual function logic is simplified for this question
    return 1;
  END IF;
  
  return 0;
END;
$$;

是否可以定义一组 bigint 并从 select 联合分配它?像这样:

CREATE FUNCTION xyz (base_id bigint)
returns int
language plpgsql
as $$
DECLARE
  allowed_base_ids bigint; -- needs to be a setof
BEGIN
  select into allowed_base_ids get_owned_base_ids() UNION select get_bases_editable();

  IF kv.base_id not in allowed_base_ids THEN
    -- note: actual function logic is simplified for this question
    return 1;
  END IF;
  
  return 0;
END;
$$;

通常意义不大,占用内存多,结果集很大,但可以用数组:

DECLARE
   allowed_base_ids bigint[];
BEGIN
   allowed_base_ids := array(SELECT * FROM get_owned_base_ids()
                             UNION ALL
                             SELECT * FROM get_bases_editable());

   IF kv.base_id <> ALL (allowed_base_ids) THEN
      ...
   END IF;
END;