对于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循环将解决它。显然我错了。即使它确实正确地查询了结果,我甚至不知道如何成功输出结果。我迷失了,一点方向都会走很长的路。
答案 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;
/