declare
cursor c_Dep is
select dno,dname from dep ;
p_dNo DEP.DNO%type;
p_dName DEP.DNAME%type;
cursor c_SC(courseName varchar2,departmentNo number) is
select grade from sc where cno = (select cno from course where cname = courseName ) and sno in (select sno from student where dno = departmentNo);
p_grade sc.grade%type;
final_courseName varchar(20) := '大学物理';
avg_po number;
cnt1 number;cnt2 number;cnt3 number;
begin
DELETE FROM MSG;
open c_Dep;
loop
fetch c_Dep into p_dNo,p_dName;
exit when c_Dep%notFound;
--先看各系的平均成绩
select avg(grade) into avg_po from sc where cno = (select cno from course where cname = final_courseName ) and sno in (select sno from student where dno = p_dNo);
cnt1 := 1;cnt2 :=2;cnt3 :=3;
open c_SC(final_courseName,p_dNo);
loop
fetch c_SC into p_grade;
exit when c_SC%notFound;
if p_grade < 60 then cnt1 := cnt1 + 1;
elsif p_grade>=60 and p_grade<85 then cnt2:=cnt2+1;
else cnt3 := cnt3 + 1;
end if;
end loop;
close c_SC;
insert into msg(pcoursename,pdname,cou1,cou2,cou3,avg4) values (final_courseName,p_dName,cnt1,cnt2,cnt3,avg_po);
end loop;
close c_Dep;
end;
SQL 习练体会:
1.不练习不会清楚能走到哪一步,本人遇到问题:
不知道一个变量的出现,首先带上类型,不论游标参数或者是开始声明的变量
不初始化的变量不会参与到计算中,如上面的 cnt1,cnt2,cnt3
记住 elsif 这个写法,还有 dbms_output.put_line();
程序如果没有看到结果,就不应该相信自己会做出来。而这个 SQL Developer 平台,可以良好展示自己的SQL 技术。
本文分享了在SQL开发过程中的个人心得与实践案例,强调了变量类型的重要性、正确使用循环与条件语句,以及利用SQLDeveloper平台进行调试与验证的方法。通过具体实例,展示了如何分析各系学生在特定课程上的平均成绩分布,并根据成绩区间进行分类统计。

被折叠的 条评论
为什么被折叠?



