从获取所有行创建视图(调用返回游标的函数)

时间:2017-05-10 20:17:17

标签: postgresql

在postgreSQL中,我已成功设法创建一个返回refcursor的函数,在第二步中可以获取所有行。

我想创建一个包含函数返回的记录的视图,但我无法弄清楚如何实现这一点(如果有的话),因为SELECT语句只返回游标而不是记录。这些需要使用FETCH ALL FROM获取。

这是函数(它基本上是对this blog post中解释的内容的修改):

CREATE OR REPLACE FUNCTION do_cross_cursor()
RETURNS refcursor AS $$
DECLARE
col_list text[] := '{}';
query text;
r RECORD;
result refcursor := 'result';
BEGIN
FOR r IN EXECUTE 'SELECT DISTINCT jahrmonat::text FROM susa2'
LOOP
col_list := array_append(col_list, 'SUM(CASE jahrmonat WHEN'
 || quote_literal(r.jahrmonat) || ' THEN wert_monat_kum'
 || ' ELSE 0 END) AS ' || quote_ident(r.jahrmonat) || '');
END LOOP;
query := 'SELECT pk, '
 || array_to_string(col_list, ',')
 || ', SUM(wert_monat_kum) AS Total FROM susa2 GROUP BY pk';
 OPEN result NO SCROLL FOR EXECUTE query;
RETURN result;
END;
$$ LANGUAGE plpgsql STRICT;

我随后执行了我的数据:

BEGIN;
SELECT do_cross_cursor();
FETCH ALL FROM result;
END;

有没有办法让FETCH ALL FROM result;流入视图?

1 个答案:

答案 0 :(得分:0)

回答你的问题:不。 view需要定义所有列,并且不能将fetch放入视图定义。但你可以解决方法。像是:

select DISTINCT 
pk, jahrmonat,count(1) over (partition by pk,jahrmonat), SUM(wert_monat_kum) AS Total 
FROM susa2

应垂直向您提供相同的数据,以便您can try crosstab将其转换为您的数据集。