代码(根据课程,列出所有院系成绩及平均分数)

来源:5-6 案例:成绩统计(下)

雲中菩提

2015-09-22 13:52

分析:

/*
用到的表:
--教师信息(教师编号tno,教师姓名tname,职称title,聘用时间hiredate,工资sal,奖金bonus,领导mgr,院系编号deptno)
--学生信息student(学生编号sno,学生姓名sname,性别sex,生日birth,密码passwd,院系编号dno)
--院系信息dep(院系编号dno,院系名称dname,教师编号director,电话tel)
--考试信息sc(学生编号sno,课程编号cno,分数grade)
--课程信息course(课程编号cno,课程名称cname,课程学分credit,课时ctime,课程分数quota)
*/

/*
过程分析:

1.得到课程
select cno,cname from course;
pcno 课程编号
pcname  课程名称

2.得到院系
select dno,dname from dep ;
pdno 
pdname;

3.得到某课程,某院系,学生考试成绩
select grade from sc where cno=pcno and sno in (select sno from student dno=pdno);
psumstu 学生人数
psumgra 总分
count1
count2
count3
avggra = sumgra/sumstu;

4.插入结果
insert into msg1 values(pcname, pdname, count1,count2,count3,avggra);
*/

代码:

declare
  --定义光标cemp1:得到课程列表
  cursor cemp1 is select cno,cname from course;
  pcno course.cno%type;
  pcname course.cname%type;
  --定义光标cemp2:得到院系列表
  cursor cemp2 is select dno,dname from dep;
  pdno dep.dno%type;
  pdname dep.dname%type;
  --定义光标cemp3:得到某课程,某院系,学生考试成绩
  cursor cemp3(xcno course.cno%type,xdno dep.dno%type) is select grade from sc where cno=xcno and sno in (select sno from student where dno = xdno);
  pgrade sc.grade%type;
  psumstu number;
  psumgra sc.grade%type;
  count1 number;
  count2 number;
  count3 number;
  
  begin
  
  open cemp1;
  --取得一条课程数据
  loop
  fetch cemp1 into pcno,pcname;
  exit when cemp1%notfound;
    
    open cemp2;
    loop
    --取得一条院系
    fetch cemp2 into pdno,pdname;
    exit when cemp2%notfound;
    
    --设置数据
    count1 :=0;
    count2 :=0;
    count3 :=0;
    psumstu :=0;
    psumgra :=0;
    
      open cemp3(pcno,pdno);
      loop
      --取得一条学员分数
      fetch cemp3 into pgrade;
      exit when cemp3%notfound;
        
        if (pgrade<60) then count1 :=count1+1;
        elsif (pgrade>=60 and pgrade<85) then count2 :=count2+1;
        else count3 :=count3+1;
        end if;
        
        psumstu := psumstu +1;--学员总人数
        psumgra := psumgra + pgrade;--学员总分数
      
      end loop;
      close cemp3;
      --插入数据
      --为了避免被除数0的错误,先判断psumstu的值是否为0
      if(psumstu<>0) then
      insert into msg1 values(pcname,pdname,count1,count2,count3,(psumgra/psumstu));
      else
       insert into msg1 values(pcname,pdname,count1,count2,count3,0);
       end if;
       
    end loop;
    close cemp2;
  
  end loop;
  close cemp1;
  
  end;
/

结果:

--查看课程 大学物理 的成绩
select * from msg1 where coursename='大学物理';

http://img.mukewang.com/5600ebf90001676705580153.jpg



写回答 关注

1回答

  • qq_文_17
    2016-05-19 08:53:32

    可以的,多练习 之后可以不看老师的代码做出来 并且理解了 那就算是学会了

Oracle数据库开发必备利器之PL/SQL基础

Oracle数据库高级开发必备的基础,通过实例带你熟练掌握

75048 学习 · 208 问题

查看课程

相似问题