案例:成绩统计
用PLSQL语言编写一个程序。按系(系名)分段统计(成绩小于60分,60-85分,85分以上)“大学物理”课程各分数段的学生人数,及各系学生的平均成绩。
/*
SQL语句
1.得到有哪些系
select dno,dname from dep;
-->光标-->循环-->退出条件:notfound
2.得到系中,选修了“大学物理”课程学生的成绩
select grade from sc where cno=(select cno from course where cname=??)
and sno in(select sno from student where dno=??);
-->带参数的光标-->循环-->退出条件:notfound
变量:
1.初始值 2.如何得到
每个分数段的人数
count1 number;count2 number;count3 number;
每个系选修了“大学物理”学生的平均成绩
avggrade number;
1.算术运算
2.select avg(grade) into avggrade from sc where cno=(select cno from course where cname=??)
and sno in(select sno from student where dno=??);
*/
set serveroutput on
declare
--系的光标
cursor cdept is select dno,dname from dep;
pdno dep.dno%type;
pdname dep.dname%type;
--成绩光标
cursor cgrade(coursename varchar2,depno number)
is select grade from sc where cno=(select cno from course where cname=coursename)
and sno in(select sno from student where dno=depno);
pgrade sc.grade%type;
--每个分数段的人数
count1 number;count2 number;count3 number;
--每个系选修了“大学物理”学生的平均成绩
avggrade number;
--课程名称
pcourseName varchar2:='大学物理';
begin
--打开系的光标
open cdept;
loop
--取一个系的信息
fetch cdept into pdno,pdname;
exit when cdept%notfound;
--初始化工作
count1:=0;count2:=0;count3:=0;
--系的平均成绩
select evg(grade)into avggrade sc where cno=(select cno from course where cname=pcourseName)
and sno in(select sno from student where dno=pdno);
--取系中,选修了大学物理的学生成绩
--打开成绩光标
open cgrade(pcourseName,pdno);
loop
--取一个学生的成绩
fetch cgrade into pgrade;
exit when cgrade%notfound;
--判断成绩的范围
if pgrade<60 then count1:=count1+1;
elsif pgrade>=60 and pgrade<85 then count2:=count2+1;
else count3:=count3+1;
end if;
end loop;
--关闭成绩光标
close cgrade;
--保存当前的结构
insert into msg1 values(pcourseName,pdname,count1,count2,count3,avggrade)
end loop;
--关闭系的光标
close cdept;
commit;
dbms_output.put_line('统计完成');
end;
/