Oracle
 sql >> Base de données >  >> RDS >> Oracle

effectuer des calculs sur des données de type tableau

Existe-t-il une raison de ne pas le sélectionner dans votre requête ?

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;

Cela placera un nouveau champ dans votre enregistrement nommé avg_score, avec le score moyen d'un étudiant donné.

EDIT :Vous pouvez également créer une déclaration TYPE au niveau de la base de données pour la structure d'enregistrement. Si vous souhaitez utiliser DML sur un type d'objet, vous devrez le créer au niveau de la base de données, et non au niveau PL/SQL, car la base de données ne connaît pas les types définis 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;

Ensuite, dans votre code :

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;

Totalement non testé. C'est l'idée générale, cependant.