--【导例9.5】 使用游标统计某班某课程学生成绩分布。
use 教学成绩管理数据库
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[某班某门课程成绩分布表]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[某班某门课程成绩分布表]
go

create procedure 某班某门课程成绩分布表
@班名 varchar(20), @课程名 nchar(16), @人数 int output,
@优 int output, @良 int output, @中 int output, @及 int output, @不 int output as
begin
   declare @成绩 char(10), @分数 decimal
   set @优 = 0
   set @良 = 0
   set @中 = 0
   set @及 = 0
   set @不 = 0
   declare c成绩游标 cursor local keyset for 
select 成绩, 分数 from 教学成绩表视图 
where rtrim(班级)=@班名 
and rtrim(课程名称)=@课程名
   open c成绩游标
   set @人数 =  @@cursor_rows
   fetch c成绩游标 into @成绩, @分数
   while @@fetch_status = 0
      begin
      set @成绩 = rtrim(@成绩)
      if @分数 >= 90 set @优 = @优 + 1
      if @分数 < 90 and @分数 >= 80 set @良 = @良 + 1
      if @分数 < 80 and @分数 >= 70 set @中 = @中 + 1
      if @分数 < 70 and @分数 >= 60 set @及 = @及 + 1
      if @分数 < 60 and (@成绩 like '[0-9]%' or @成绩='不及格')
		set @不 = @不 + 1
      fetch c成绩游标 into @成绩, @分数
      end
   close c成绩游标
   deallocate c成绩游标
end
