我正在尝试使用PL / SQL收集学生总学分的总计

时间:2013-04-23 16:28:23

标签: sql oracle plsql

对于PL / SQL,我非常“noob”,但我必须专门编写一些PL / SQL代码(DECLARE / BEGIN / etc。),而不仅仅是查询。

我真的想找到一个好的例子,希望能让我掌握其余的问题。这是我目前正在试图解决的问题:

编写一个PL / SQL程序来计算每个学生的学分总数。注意:学生获得F的课程不计入学分。如果学生重新入读他/她获得低分的课程,则只计入一次学分。输出应包括studentnum和总学分。

Student-schema =(studentnum, name, standing, gpa, major)
Class-schema = (schedulenum, semester, department, classnum, days, time, place, enrollment)
Instructor-schema = (name, department, office)
Teaches-schema = (name, schedulenum, semester)
Taking-schema = (studentnum, schedulenum, semester, grade)

这是我可怜的尝试之一:

DECLARE
    stud_id student.studentnum%TYPE;
    total number(10);
BEGIN
    FOR count IN (SELECT* FROM taking)
    LOOP
        SELECT studentnum, count(*) total
    INTO stud_id, total
    WHERE grade >= 1;
    END LOOP;
END; 
/

在上面的一个中,idk我做错了什么或是对的。我在第1行收到错误“确切提取返回超过请求的行数”。之前我遇到此错误,并认为for循环将解决它。显然我错了。即使它确实正确地查询了结果,我甚至不知道如何成功输出结果。我迷失了,一点方向都会走很长的路。

3 个答案:

答案 0 :(得分:1)

下面的代码会迭代学生的结果集和成绩计数,而不是“F”成绩。该片段没有实现任何课程可能贡献超过一个等级的限制;但是,它应该让你开始,所以你可以补充缺少的部分。

DECLARE
    stud_id student.studentnum%TYPE;
    total number(10);
BEGIN
    FOR i IN (
        SELECT s.studentnum  stud
             , COUNT(*)      cnt
          FROM student  s
          JOIN taking   t   on ( t.studentnum   = s.studentnum  )
          JOIN class    c   on ( c.schedulenum  = t.schedulenum )
         WHERE t.grade > 0
      GROUP BY s.studentnum
    ) LOOP
        NULL; -- whatever
    END LOOP;
END; 
/

答案 1 :(得分:0)

我认为select * from taking不返回数字,它会返回一堆行。如果您想要所需的行数,请将其设为SELECT count(*) FROM taking

答案 2 :(得分:0)

我相信我找到了一个合适的解决方案。这些答案都没有真正起作用,所以我最终只是制作一个光标来浏览数据。由于我正在做的连接,我相信它会过滤掉同一个学生所采用的重复课程:

DECLARE
    CURSOR c IS
        SELECT taking.studentnum, count(*) total
        FROM student, taking, class
        WHERE grade > 0
    AND student.studentnum = taking.studentnum
    AND taking.schedulenum = class.schedulenum
    AND taking.semester = class.semester
    GROUP BY taking.studentnum;
    credits c%ROWTYPE;
BEGIN
    OPEN c;
    LOOP
    FETCH c INTO credits;
        EXIT WHEN c%NOTFOUND;
    dbms_output.put_line('Student#: ' || credits.studentnum || 
        '  Credits: ' || credits.total);
    END LOOP;
END;
/