記事ディレクトリ
カーソルの使用は5つのステップに分かれています
。1.カーソルを宣言します
2. カーソルを開きます
3. カーソルのデータを読み取ります
4. カーソルを閉じます
5.カーソルを離します
エラーが発生しやすい場所:
1. whileで開始および終了
2.値を更新するときにsetまたはselectを使用します
1.コースを選択しなかった学生の数を数える
関連テーブル:Student、SC
--1、声明游标
declare num_cursor cursor
for
select sno
from student
for read only
--2、打开游标
open num_cursor
--声明变量
declare @sno char(20), @num int
select @num = 0
--3、读取游标中的数据
fetch next from num_cursor
into @sno
while @@FETCH_STATUS = 0
begin
if not exists(select* from sc where Sno = @sno)
select @num = @num + 1
fetch next from num_cursor
into @sno
end
--打印未选课的学生人数
select @num
--4、关闭游标
close num_cursor
--5、释放游标
deallocate num_cursor
効果:
2.各科目の選択科目の数を印刷します
関連テーブル:コース、スコア
--1、声明游标
declare cno_cursor cursor
for
select cno
from course
for read only
--2、打开游标
open cno_cursor
--声明变量
declare @cno char(20), @num int
select @num = 0
--3、读取游标中的数据
fetch next from cno_cursor
into @cno
while @@FETCH_STATUS = 0
begin
select @num = COUNT(*) from Score where cno = @cno
--打印当前科目的人数
print convert(char(5), @cno) + ':' + convert(char(1), @num)
fetch next from cno_cursor
into @cno
end
--4、关闭游标
close cno_cursor
--5、释放游标
deallocate cno_cursor
効果:
3.生徒の成績に基づいて、各レベルの人数を計算して数えます
関連テーブル:sc
--声明游标
declare grade_cursor cursor
for
select grade
from sc
for read only
--打开游标
open grade_cursor
declare @grade int, @a int, @b int, @c int, @d int, @e int
select @a = 0, @b = 0, @c = 0, @d = 0, @e = 0
--读取游标中的数据
fetch next from grade_cursor
into @grade
while @@FETCH_STATUS = 0
begin
if @grade is null or @grade < 60
select @e = @e + 1
else
if @grade < 70
select @d = @d + 1
else
if @grade < 80
select @c = @c + 1
else
if @grade < 90
select @b = @b + 1
else
select @a = @a + 1
fetch next from grade_cursor
into @grade
end
select @a, @b, @c, @d, @e
--关闭游标
close grade_cursor
--释放游标
deallocate grade_cursor
4.従業員の給与に基づいて個人所得税を計算します。しきい値は3000元で、3000元を超える部分は10%の割合で個人所得税が課税されます
関連テーブル:salary_table
--声明游标
declare salary_cursor cursor
for
select cno, salary
from salary_table
for read only
--打开游标
open salary_cursor
declare @cno char(10), @salary int, @tax int
--读取游标中的数据
fetch next from salary_cursor
into @cno, @salary
while @@FETCH_STATUS = 0
begin
if @salary <= 3000
select @tax = 0
else
select @tax = (@salary - 3000) * 0.1
update salary_table set tax = @tax where cno = @cno
fetch next from salary_cursor
into @cno, @salary
end
--关闭游标
close salary_cursor
--释放游标
deallocate salary_cursor