Czy istnieje powód, aby nie wybierać go w zapytaniu?
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;
Spowoduje to dodanie do Twojego rekordu nowego pola o nazwie avg_score ze średnim wynikiem dla danego ucznia.
EDYCJA:Alternatywnie można utworzyć deklarację TYPE na poziomie bazy danych dla struktury rekordów. Jeśli chcesz użyć DML na typie obiektu, musisz utworzyć go na poziomie bazy danych, a nie na poziomie PL/SQL, ponieważ baza danych nie zna typów zdefiniowanych w 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;
Następnie w swoim kodzie:
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;
Całkowicie niesprawdzony. To jest jednak ogólna idea.