我是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中并返回
有什么帮助吗?
答案 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 TABLE
和RETURN 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;