1. 程式人生 > >PL/SQL——案例:成績統計

PL/SQL——案例:成績統計

案例:成績統計

用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;
/