如何在PostgreSQL中填充集合

时间:2018-12-20 08:19:37

标签: 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 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填充到用户定义的集合empIds中并返回

有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

在Postgres中,您可以通过从select

执行INT[]返回整数ARRAY_AGG的数组。

测试数据

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)

要使其成行,可以这样做

select * FROM  UNNEST(printempids ()) as id;

尽管此功能可以使用集合复制Oracle的TABLE功能,但我建议您在Postgres中使用RETURNS TABLERETURN QUERY SELECT ..

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
(3 rows)

或者简单的SQL函数也可以。

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