存储过程如下:
create procedure calcGPAbySno (
@vsno char(10),
@avg_gpa decimal(10,2) out
) as
declare @gpa decimal(10,1);
declare @vcredit int;
declare @vgrade int;
declare @sum_credit int;
declare @sum_gpa decimal(10,1);
declare cur_gpa cursor for select Ccredit,grade from course c,sc where c.cno=sc.cno and sno=@vsno and year<>'2014';
begin
set @sum_gpa=0.0;
set @sum_credit=0;
open cur_gpa;
fetch next from cur_gpa into @vcredit,@vgrade;
while @@FETCH_STATUS=0
begin
if @vgrade>=95 set @gpa=5.0;
else if @vgrade<60 set @gpa=0;
else set @gpa=5.0-(95-@vgrade)*0.1;
set @sum_credit=@sum_credit+@vcredit;
set @sum_gpa=@sum_gpa+@gpa*@vcredit;
fetch next from cur_gpa into @vcredit,@vgrade;
end;
close cur_gpa;
deallocate cur_gpa;
if @sum_credit=0 set @avg_gpa=0
else set @avg_gpa=@sum_gpa/@sum_credit;
update student set gpa=@avg_gpa where sno=@vsno;
end;
这是为了实现输入为学生学号,输出为该学生的GPA的功能,并且考虑大一刚入学、正在学课程、不及格课程等情况。