Прошу помощи с написанием курсора на postgresSQL - есть такое задание
Хранимая процедура для расчета успеваемости и прироста успеваемости Хранимая процедура имеет два параметра определяющие анализируемый интервал времени. Результатом работы процедуры должна явится выборка, содержащая средний бал по всем предметам в рассматриваемом интервале времени, и разницу текущего среднего балла и предыдущего.
Алгоритм реализации предлагается следующий. Организуется курсор, перебирающий все года, в которых проводилось обучение, попадающие в заданный интервал времени. Средний бал предыдущего года запоминается в переменной. В теле курсора формируется выборка необходимых данных.
Переписываю с MySQL на postgresSQL и ничего не работает, как исправить подскажите...
CREATE OR REPLACE FUNCTION public."Student_UP_UPp"(
date_begin character varying(50),
date_end character varying(50))
RETURNS record
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
avg_prew real = 0;
avg_now real = 0;
tempp character varying(50);
done integer = 0;
cur CURSOR FOR
SELECT AVG("MARKS"."VALUE"), "GROUPS"."NAME"
FROM "PEOPLE", "MARKS", "GROUPS"
WHERE "PEOPLE"."ID" = "MARKS"."STUDENT_ID"
AND "PEOPLE"."GROUP_ID" = "GROUPS"."ID"
AND RIGHT("GROUPS"."NAME", 4)
BETWEEN date_begin AND date_end
GROUP BY RIGHT("GROUPS"."NAME", 4) ORDER BY
RIGHT("GROUPS"."NAME", 4);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; - проблема с этой
строкой
SELECT AVG("MARKS"."VALUE"), "GROUPS"."NAME"
FROM "PEOPLE", "MARKS", "GROUPS"
WHERE "PEOPLE"."ID" = "MARKS"."STUDENT_ID"
AND "PEOPLE"."GROUP_ID" = "GROUPS"."ID"
AND RIGHT("GROUPS"."NAME", 4)
BETWEEN date_begin AND date_end
GROUP BY RIGHT("GROUPS"."NAME", 4), "GROUPS"."ID" ORDER BY
RIGHT("GROUPS"."NAME", 4);
BEGIN
Open cur;
repeat равно ли это такой строке в постгрес-> LOOP
FETCH cur INTO avg_now, tempp;
IF NOT done THEN
SELECT avg_now-avg_prew;
SET avg_prew=avg_now;
END IF;
until done
end repeat; = ли это такой строке в постгрес-> EXIT WHEN NOT done;
END LOOP;
CLOSE cur;
END;
$BODY$;
Вызываю через
SELECT public."Student_UP_UPp"('2016', '2017')
Изначальный код на MYSQL
create procedure student_up(IN date_begin char(50), IN date_end char(50))
begin
declare avg_prew float default 0;
declare avg_now float default 0;
declare temp char(50);
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
select avg(marks.value), groups.name
from people, marks, groups
where people.id = marks.student_id and people.group_id = groups.id and
right(groups.name, 4) between date_begin and date_end
group by right(groups.name, 4) order by right(groups.name, 4);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
select avg(marks.value), groups.name
from people, marks, groups
where people.id = marks.student_id and people.group_id = groups.id and
right(groups.name, 4) between date_begin and date_end
group by right(groups.name, 4) order by right(groups.name, 4);
Open cur;
repeat
FETCH cur INTO avg_now, temp;
IF NOT done THEN
select avg_now - avg_prew;
set avg_prew = avg_now;
end if;
until done end repeat;
close cur;
END
call student_up("2015","2018");
drop procedure if exists student_up;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
при отправки GET-запроса возвращаются вопросы вместо кириллицыКак можно исправить? Использую SLIM в PHP Ответ приходит в таком виде: