首页 > 解决方案 > 如何在 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中并返回

任何帮助将是可观的?

标签: postgresql

解决方案


INT[]在 Postgres 中,您可以通过执行ARRAY_AGGfrom select来返回一个整数数组

测试数据

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;

尽管此功能可以TABLE使用集合复制 Oracle 的功能,但我建议您在 Postgres 中使用RETURNS TABLEandRETURN 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;

推荐阅读