У меня есть таблица с сериями месяцев с совокупной активностью, например.Plpgsql - Итерация по набору записей несколько раз
month | activity
Jan-15 | 20
Feb-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
Doh! Я думал, что-то вроде этого может работать, но я уволил его - никогда не недооценивайте силу sql! Он работал только тогда, когда я изменил его на «месяцы m на t.threshold
@Stev_k _It работал только тогда, когда я изменил его на «месяцы m на t.threshold
забавно, нет, я этого не делал. Я бы подумал, что это было бы необходимо, поскольку я думал, что отдельный выбирает первую уникальную запись, но, похоже, она работает нормально для меня, не меняя порядок - не знаю, почему. –