【发布时间】:2014-09-17 16:42:50
【问题描述】:
我有一张表,其中包含一系列月份的累积活动,例如
month | activity
1 月 15 日 | 20
2 月 15 日 | 22
我在另一个表中也有一系列阈值,例如50、100、200。我需要获取达到阈值的日期,即活动 >= 阈值。
我想到的方法是有一个 pgsql 函数读取阈值表,迭代该游标并将月份表中读取到游标,然后迭代这些行以计算阈值所在的月份到达。出于性能原因,我不是每次都选择月份表中的所有行,而是返回游标中的第一行并使用阈值表中的新值重新迭代。
这是解决问题的明智方法吗?这就是我到目前为止所拥有的 - 我得到了一个
ERROR: cursor "curs" already in use 错误。
CREATE OR REPLACE FUNCTION schema.function()
RETURNS SETOF schema.row_type AS
$BODY$
DECLARE
rec RECORD;
rectimeline RECORD;
notification_threshold int;
notification_text text;
notification_date date;
output_rec schema.row_type;
curs SCROLL CURSOR FOR select * from schema.another_function_returning_set(); -- this is months table
curs2 CURSOR FOR select * from schema.notifications_table;
BEGIN
OPEN curs;
FOR rec IN curs2 LOOP
notification_threshold := rec.threshold;
LOOP
FETCH curs INTO rectimeline; -- this line seems to be the problem - not sure why cursor is closing
IF notification_threshold >= rectimeline.activity_total THEN
notification_text := rec.housing_notification_text;
notification_date := rectimeline.active_date;
SELECT notification_text, notification_date INTO output_rec.notification_text, output_rec.notification_date;
MOVE FIRST from curs;
RETURN NEXT output_rec;
END IF;
END LOOP;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
【问题讨论】:
标签: postgresql cursor plpgsql