Postgresql 8.4一个变量,用于保存从另一个函数返回的记录集

Postgresql 8.4一个变量,用于保存从另一个函数返回的记录集,postgresql,postgresql-8.4,Postgresql,Postgresql 8.4,我在后端使用postgresql 8.4 我有一个postgres函数,它可以返回一组记录,3列如下: <A_id>::int,<A_ts_1>::timestamp,<A_ts_2>::timestamp 函数A已在另一个函数B中调用。在函数B中,我需要一个变量来保存从A返回的内容,然后执行一些查询,例如: CREATE OR REPLACE FUNCTION A() RETURNS SETOF record AS

我在后端使用postgresql 8.4

我有一个postgres函数,它可以返回一组记录,3列如下:

<A_id>::int,<A_ts_1>::timestamp,<A_ts_2>::timestamp
函数A已在另一个函数B中调用。在函数B中,我需要一个变量来保存从A返回的内容,然后执行一些查询,例如:

CREATE OR REPLACE FUNCTION A()
          RETURNS SETOF record AS
          $$
          DECLARE

            BEGIN
                RETURN QUERY SELECT DISTINCT ON (A.id) A.id, A.ts_1, A.ts_2 FROM tablea;

         END;
        $$ LANGUAGE plpgsql;
      SQL
<variable> = select * from A();
a_id_array = ARRAY(select A_id from <variable>);
a_filtered_array =  ARRAY(select A_id from <variable> where A_ts_1 ><a_timestamp> and A_ts_2 < <a_timestamp>);
a_id_array = ARRAY(select A_id from A());
a_filtered_array =  ARRAY(select A_id from A() where A_ts_1 ><a_timestamp> and A_ts_2 < <a_timestamp>);
所以我的问题是我应该定义什么变量来保存从A返回的记录集

我尝试了temp表,它确实不适合多会话环境,它会阻止数据插入

我检查了文档中的视图似乎不符合我的要求,但是我可能错了,所以如果你们中的任何人能告诉我如何在这种情况下使用视图,并且使用视图也会阻止数据插入

谢谢大家

附言。 我认为更糟糕的情况是在函数B中,我调用函数A两次,例如:

CREATE OR REPLACE FUNCTION A()
          RETURNS SETOF record AS
          $$
          DECLARE

            BEGIN
                RETURN QUERY SELECT DISTINCT ON (A.id) A.id, A.ts_1, A.ts_2 FROM tablea;

         END;
        $$ LANGUAGE plpgsql;
      SQL
<variable> = select * from A();
a_id_array = ARRAY(select A_id from <variable>);
a_filtered_array =  ARRAY(select A_id from <variable> where A_ts_1 ><a_timestamp> and A_ts_2 < <a_timestamp>);
a_id_array = ARRAY(select A_id from A());
a_filtered_array =  ARRAY(select A_id from A() where A_ts_1 ><a_timestamp> and A_ts_2 < <a_timestamp>);

然后我的问题会有一点变化,我能用一个函数调用一个吗?

PostgreSQL还没有,在postgres 10中,表值变量由一个元组存储支持。因此,您的最佳选择是:

返回一个REFCURSOR并从另一个函数中使用它。由于无法轻松重用resultset或获取子查询,因此使用起来可能会很笨拙。根据创建结果的方式,生成游标结果集也并不总是那么容易

将临时表与生成的名称一起使用,这样它们就不会发生冲突。这里涉及很多动态SQL执行格式。。。但它是有效的

避免尝试在函数之间传递结果集


经过研究,找到了一种替换using temp表的方法,query返回了一组正在使用的记录


发现这篇文章不确定这是否会有帮助这可能会有帮助:我尝试了你的答案,但我无法进行性能测试。如果返回的记录集很大,此函数是否会变慢?检查我写的带有疑问的答案