Има ли причина да не го изберете в заявката си?
select x.student_id as student_id, cr.course_id as course_i
, g.score as grade, AVG(g.score) OVER (PARTITION BY x.student_id) as avg_score
from sf x, grade g, class cs, course cr
where x.no_of_courses>4
and x.student_id = g.student_id
and cs.course_id = cr.course_id
and g.class_id = cs.class_id;
Това ще постави ново поле във вашия запис, наречено avg_score, със средния резултат за даден ученик.
РЕДАКТИРАНЕ:Като алтернатива можете да създадете TYPE декларация на ниво база данни за структурата на записа. Ако искате да използвате DML за тип обект, ще трябва да го създадете на ниво база данни, а не на ниво PL/SQL, тъй като базата данни не знае за дефинирани от PL/SQL типове.
CREATE OR REPLACE TYPE t_rec AS OBJECT
(
student_id number,
course_id number,
grade number
);
CREATE OR REPLACE TYPE abc AS TABLE OF t_rec;
След това във вашия код:
FOR Rec IN (SELECT student_id, AVG(grade) avg_grade
FROM TABLE ( cast( v1 as abc) )
GROUP BY student_id)
LOOP
dbms_output.put_line(Rec.student_id, Rec.avg_grade);
END LOOP;
Напълно непроверено. Това обаче е общата идея.