Advertisement
Guest User

Untitled

a guest
May 28th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE PROCEDURE calculate_performance(
  2.     from_year IN INTEGER,
  3.     targ_year IN INTEGER) AS
  4.    
  5.     old_avg_mark marks.value___%TYPE;
  6.     current_subj_id NUMBER;
  7.     avg_mark_dif NUMBER;
  8.    
  9.     new_subj_id NUMBER;
  10.     new_subj_name subject.name%TYPE;
  11.     new_year NUMBER;
  12.     new_avg_mark marks.value___%TYPE;
  13.    
  14.     CURSOR year_marks_cursor(
  15.         from_year IN INTEGER,
  16.         targ_year IN INTEGER) IS
  17.             SELECT marks.subject_id, SUBSTR(groups.NAME, -4, 4) AS "Year", AVG(marks.value___)
  18.             FROM marks
  19.             join people ON people.id = marks.student_id
  20.             join groups ON groups.id = people.GROUP_ID
  21.             GROUP BY marks.subject_id, SUBSTR(groups.NAME, -4, 4)
  22.             HAVING SUBSTR(groups.NAME, -4, 4) >= from_year AND SUBSTR(groups.NAME, -4, 4) <= targ_year
  23.             ORDER BY marks.subject_id;
  24.            
  25. BEGIN
  26.     BEGIN
  27.     old_avg_mark := 0;
  28.     current_subj_id := NULL;
  29.     OPEN year_marks_cursor(from_year, targ_year);
  30.     LOOP
  31.         FETCH year_marks_cursor INTO new_subj_id, new_year, new_avg_mark;
  32.         EXIT WHEN year_marks_cursor%NOTFOUND;
  33.        
  34.         IF current_subj_id IS NULL THEN
  35.             current_subj_id := new_subj_id;
  36.         ELSIF new_subj_id <> current_subj_id THEN
  37.             old_avg_mark := 0;
  38.             current_subj_id := new_subj_id;
  39.         END IF;
  40.        
  41.         avg_mark_dif := new_avg_mark - old_avg_mark;
  42.        
  43.         old_avg_mark := new_avg_mark;
  44.         SELECT subject.name INTO new_subj_name
  45.         FROM subject
  46.         WHERE subject.id = new_subj_id;
  47.        
  48.         dbms_output.put_line(new_subj_name||'|'||new_year||'|'||new_avg_mark||'|'||avg_mark_dif);
  49.         END LOOP;
  50.         CLOSE year_marks_cursor;
  51.     END;
  52. END;
  53.  
  54.  
  55. BEGIN
  56.     calculate_performance(2000, 2019);
  57. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement