如何在PostgreSQL中填充集合 [英] How to populate a collection in postgreSQL

查看:84
本文介绍了如何在PostgreSQL中填充集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是PostgreSQL的新手,正在从事迁移任务。我正在寻找PostgreSQL中批量收集语法的替代方法,或者如何在PostgreSQL中实现此功能。

 创建功能测试。 printEmpIds()
返回test.emp_add
语言'plpgsql'
成本100
波动性
作为$ BODY $
声明
empIds test.emp_add;
开始
选择ID从test.emp批量收集empId;
-1..empIds.count循环中的idx
-引发通知 %%%,empIds.idx;
-结束循环;
return empIds;
结尾;
$ BODY $;
ALTER FUNCTION测试。 printEmpIds()
属于postgres;

基本上我想将emp表中的所有id填充到用户定义的集合empIds中并返回



有什么帮助吗?

解决方案

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



<中选择 ARRAY_AGG p> 测试数据

 创建表emp(ids INTEGER); 
插入emp(ids)values(1),(2),(3);

功能

 创建或替换功能printempids()
返回INT []
语言plpgsql
成本为100的变量,因为$ body $
声明了empids int [];
BEGIN
选择array_agg(ids)INTO实例
FROM emp;
RETURN pids;
END;
$ body $;

结果

  knayak =#选择printempids(); 
printempids
-------------
{1,2,3}
(1行)

要使其成行,您可以这样做

 选择* FROM UNNEST(printempids())作为id; 

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

 创建或替换功能printempids()
返回表(p_ids INT)
语言plpgsql
成本100易失,因为$ body $
声明了empids int [];
开始
返回查询选择ID
FROM emp;
END;
$ body $;

结果

  knayak =#选择printempids(); 
printempids
-------------
1
2
3
(3行)

也可以使用简单的SQL函数。

 创建或替换功能printempids()
RETURNS TABLE(ids INT)as
$ body $
从emp选择ID;
$ body $语言SQL
成本100易变;


I am very new to PostgreSQL and I am working on migration task. I am looking for an alternative of "bulk collect into" syntax in PostgreSQL or how I can achieve this functionality in 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;

Basically I want to populate all ids from emp table into user defined collection empIds and return

Any help would be appreciable?

解决方案

In Postgres, you may return an array of integers INT[] by doing an ARRAY_AGG from select

Test data

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

Function

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$;

Result

knayak=# select printempids ();
 printempids
-------------
 {1,2,3}
(1 row)

To get them as rows, you may do

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

Although this feature can replicate Oracle's TABLE functionality using a collection, I would suggest you to use RETURNS TABLE and RETURN QUERY SELECT .. instead in 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$;

Result

knayak=# select printempids ();
 printempids
-------------
           1
           2
           3
(3 rows)

Or a simple SQL function also works.

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

这篇关于如何在PostgreSQL中填充集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆