Курсор для бд postgres

193
25 июня 2018, 06:10

Прошу помощи с написанием курсора на 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;
READ ALSO
Структура БД SQLite3: как реализовать?

Структура БД SQLite3: как реализовать?

Нужна очень простая БДВот пример структуры:

166
Очередность выполнения cron команд

Очередность выполнения cron команд

Такая ситуацияЕсть сервер на Linux

191
Возвращаются вопросы в json

Возвращаются вопросы в json

при отправки GET-запроса возвращаются вопросы вместо кириллицыКак можно исправить? Использую SLIM в PHP Ответ приходит в таком виде:

152