问答详情
源自:5-5 案例:成绩统计(上)

完整代码展示

/*
综合案例4:
    用plsql语言编写一个程序,按系名分段统计(成绩小于60分,60~85,85分以上)"大学物理"
    课程各分数段的学生人数,及各系学生的平均成绩。
*/
set serveroutput on
declare
    --系的光标
    cursor cdept is select dno,dname from dep;
    pdno dep.dno%type;
    pdname dep.dname%type;
    
    --成绩光标
    cursor cgrade(coursename varchar2,deptno number) is select grade from sc 
    where  cno = (select cno from course where cname = coursename)
    and    sno in(select sno from student where dno = deptno);
    pgrade sc.grade%type;
    
    --每个分数段的人数
    count1 number;
    count2 number;
    count3 number;
    --每个系选修了"大学物理"学生的平均成绩
    avggrade number;
    --课程名称
    pcourseName varchar2(10) := '大学物理';
begin
  --打开系的光标 
  open cdept;
  
  loop
       --取一个系的信息
       fetch cdept into pdno,pdname;
       exit when cdept%notfound;
       
       --初始化工作
       count1 := 0;
       count2 := 0;
       count3 := 0;
       
       --系的平均成绩
       select avg(grade) into avggrade from 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,pdno,count1,count2,count3,avggrade);
  
  end loop;
  
  --关闭系的光标
  close cdept;
  commit;
  dbms_output.put_line('统计完成!');
end;
/


提问者:象牙山四大金刚_尼古拉斯赵四 2018-05-23 23:38

个回答

  • 慕丝1576089
    2018-08-23 17:20:48

    看得头痛