Postgresql 8.4 变量保存从另一个函数返回的记录集
Postgresql 8.4 a variable hold set of records returned from another function
我在后端使用 postgresql 8.4
我有一个 postgres 函数说 A() 它可以 return 一组记录(3 列),例如:
<A_id>::int,<A_ts_1>::timestamp,<A_ts_2>::timestamp
函数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
函数 A 已在另一个函数 B 中调用。在函数 B 中,我需要一个变量来保存从 A() 编辑的内容 return 然后执行一些查询,例如:
<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() 编辑 return 的记录集。
我尝试了 temp table ,它对多会话环境真的不好,它会阻止数据插入。
我检查了文档中的视图似乎不符合我的要求,但是我可能错了所以如果你们中的任何人可以给我一个关于如何在这种情况下使用视图的想法并且使用视图也会阻止数据插入?
谢谢大家!
P.S。
我认为最糟糕的情况是在函数 B() 中我调用函数 A() 两次,例如:
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() 来实现这种情况吗?
PostgreSQL(目前,从 postgres 10 开始)没有元组存储支持的 table 值变量。所以你最好的选择是:
Return a REFCURSOR
并从其他函数使用它。使用起来可能很笨拙,因为您无法轻松地重用结果集或 FETCH
在子查询中。生成游标结果集也不总是那么容易,具体取决于您创建结果的方式。
将临时 tables 与生成的名称一起使用,以免它们发生冲突。这里涉及很多动态 SQL (EXECUTE format(...)
) 但它有效。
避免尝试在函数之间传递结果集
经过研究,找到了一种使用临时 table 替换并查询返回的记录集的方法,该记录集使用 WITH 查询.
SELECT c.r_ids, c.a_r_ids into a_id_array, a_filtered_array FROM(
WITH returned_r AS (SELECT * FROM a())
SELECT * from (
SELECT ARRAY( SELECT A_id from returned_r ) as r_ids ) as a
CROSS JOIN (
SELECT ARRAY(SELECT A_id FROM returned_r WHERE A_ts_1 is NOT NULL AND A_ts_2 IS NULL) as a_r_ids
) as b
) as c;
我在后端使用 postgresql 8.4
我有一个 postgres 函数说 A() 它可以 return 一组记录(3 列),例如:
<A_id>::int,<A_ts_1>::timestamp,<A_ts_2>::timestamp
函数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
函数 A 已在另一个函数 B 中调用。在函数 B 中,我需要一个变量来保存从 A() 编辑的内容 return 然后执行一些查询,例如:
<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() 编辑 return 的记录集。
我尝试了 temp table ,它对多会话环境真的不好,它会阻止数据插入。
我检查了文档中的视图似乎不符合我的要求,但是我可能错了所以如果你们中的任何人可以给我一个关于如何在这种情况下使用视图的想法并且使用视图也会阻止数据插入?
谢谢大家!
P.S。 我认为最糟糕的情况是在函数 B() 中我调用函数 A() 两次,例如:
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() 来实现这种情况吗?
PostgreSQL(目前,从 postgres 10 开始)没有元组存储支持的 table 值变量。所以你最好的选择是:
Return a
REFCURSOR
并从其他函数使用它。使用起来可能很笨拙,因为您无法轻松地重用结果集或FETCH
在子查询中。生成游标结果集也不总是那么容易,具体取决于您创建结果的方式。将临时 tables 与生成的名称一起使用,以免它们发生冲突。这里涉及很多动态 SQL (
EXECUTE format(...)
) 但它有效。避免尝试在函数之间传递结果集
经过研究,找到了一种使用临时 table 替换并查询返回的记录集的方法,该记录集使用 WITH 查询.
SELECT c.r_ids, c.a_r_ids into a_id_array, a_filtered_array FROM(
WITH returned_r AS (SELECT * FROM a())
SELECT * from (
SELECT ARRAY( SELECT A_id from returned_r ) as r_ids ) as a
CROSS JOIN (
SELECT ARRAY(SELECT A_id FROM returned_r WHERE A_ts_1 is NOT NULL AND A_ts_2 IS NULL) as a_r_ids
) as b
) as c;