如何在postgreSQL中填充集合

如何在postgreSQL中填充集合,postgresql,Postgresql,我对PostgreSQL非常陌生,正在从事迁移任务。我正在寻找PostgreSQL中“批量收集到”语法的替代方法,或者如何在PostgreSQL中实现此功能 CREATE FUNCTION test."printEmpIds"() RETURNS test.emp_add LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ declare empIds test.emp_add; begin select ids bulk collect e

我对PostgreSQL非常陌生,正在从事迁移任务。我正在寻找PostgreSQL中“批量收集到”语法的替代方法,或者如何在PostgreSQL中实现此功能

    CREATE FUNCTION test."printEmpIds"()
RETURNS test.emp_add
LANGUAGE 'plpgsql'
COST 100
VOLATILE 
AS $BODY$
declare 
empIds test.emp_add;
begin
select ids bulk collect empIds from test.emp;
-- for idx in 1..empIds.count loop
-- raise notice '%%%', empIds.idx;
-- end loop;
return empIds;
end;
$BODY$;
ALTER FUNCTION test."printEmpIds"()
OWNER TO postgres;
基本上,我希望将emp表中的所有ID填充到用户定义的集合EMPID中并返回


任何帮助都是值得的?

在Postgres中,您可以通过从select执行
array\u AGG
返回整数数组
INT[]

测试数据

create table emp ( ids INTEGER );
insert into emp(ids) values(1),(2),(3);
功能

CREATE OR REPLACE FUNCTION printempids ()
RETURNS INT[]
LANGUAGE plpgsql
COST 100 volatile as $body$ 
declare empids int[];
BEGIN
     SELECT array_agg(ids) INTO empids
      FROM emp;
     RETURN empids;
END;
$body$;
结果

knayak=# select printempids ();
 printempids
-------------
 {1,2,3}
(1 row)
knayak=# select printempids ();
 printempids
-------------
           1
           2
           3
(3 rows)
要将它们作为行,可以执行以下操作

select * FROM  UNNEST(printempids ()) as id;
虽然此功能可以使用集合复制Oracle的
功能,但我建议您在Postgres中使用
返回表
返回查询选择..

CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( p_ids INT )
LANGUAGE plpgsql
COST 100 volatile as $body$ 
declare empids int[];
BEGIN
     RETURN QUERY SELECT ids 
      FROM emp;
END;
$body$;
结果

knayak=# select printempids ();
 printempids
-------------
 {1,2,3}
(1 row)
knayak=# select printempids ();
 printempids
-------------
           1
           2
           3
(3 rows)
或者一个简单的SQL函数也可以工作

CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( ids INT ) as 
$body$ 
  SELECT ids FROM emp;
$body$ LANGUAGE SQL
COST 100 volatile;