1 --游標(biāo)知識點(diǎn)
2 --1、在SELECT 語句中使用DISTINCT、 GROUP BY、 HAVING UNION 語句時(shí), 游標(biāo)將自動設(shè)定INSENSITIVE 選項(xiàng)。
3 --2、SCROLL表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用該保留字,那么只能進(jìn)行NEXT 提取操作。
4 --例8.4.1: 游標(biāo)演示
5 declare c_cursor scroll cursor for
6 select * from student
7 open c_cursor
8 fetch last from c_cursor
9 fetch prior from c_cursor
10 fetch absolute 2 from c_cursor
11 fetch relative 2 from c_cursor
12 fetch relative -2 from c_cursor
13 fetch first from c_cursor
14 fetch prior from c_cursor
15 fetch next from c_cursor
16 fetch c_cursor
17 close c_cursor
18 deallocate c_cursor
19 --例8.4.2 定義一個(gè)查詢?nèi)啃铡皬垺钡膶W(xué)生姓名的游標(biāo),并使用FETCH NEXT逐個(gè)提取這些行。
20 declare sname_cur1 cursor for
21 select sname from student
22 where sname like '張%'
23 open sname_cur1
24 fetch next from sname_cur1
25 WHILE @@FETCH_STATUS = 0
26 BEGIN
27 FETCH NEXT FROM Sname_cur1
28 END
29 CLOSE Sname_cur1
30 DEALLOCATE Sname_cur1
31 --例8.4.3 定義一個(gè)查詢?nèi)啃铡皬垺钡膶W(xué)生姓名和所在系的游標(biāo),但將FETCH語句的輸出保存在局部變量中,而不是直接返回給客戶端。用PRINT語句將變量組合成一個(gè)字符串,字符串形式為:系名+“學(xué)生:”+學(xué)生姓名。
32 DECLARE @sname varchar(10), @dept varchar(30)
33 DECLARE Sname_cur2 CURSOR FOR
34 SELECT Sname, Sdept FROM Student
35 WHERE Sname LIKE '張%'
36 ORDER BY Sage
37 OPEN Sname_cur2
38 FETCH NEXT FROM Sname_cur2 INTO @sname, @dept
39 WHILE @@FETCH_STATUS = 0
40 BEGIN
41 PRINT @dept '學(xué)生: ' @sname
42 FETCH NEXT FROM Sname_cur2 INTO @sname, @dept
43 END
44 CLOSE Sname_cur2
45 DEALLOCATE Sname_cur2
46 --例8.4.4 聲明查詢計(jì)算機(jī)系學(xué)生姓名、選的課程名和成績的游標(biāo),并將游標(biāo)內(nèi)容按成績降序排序。
47 DECLARE CS_cursor SCROLL CURSOR FOR
48 SELECT Sname, Cname, Grade FROM Student S
49 JOIN SC ON S.Sno = SC.Sno
50 JOIN Course C ON C.Cno = SC.Cno
51 WHERE Sdept = 'cs'
52 ORDER BY Grade DESC
53 OPEN CS_cursor
54 fetch last from cs_cursor
55 CLOSE CS_cursor
56 DEALLOCATE CS_cursor
57 --例8.4.5 生成顯示如下報(bào)表形式的游標(biāo):報(bào)表首先列出一門課程的課程號和課程名(只針對有人選的課程),然后在此課程下列出選了此門課程且成績大于等于80的學(xué)生姓名、所在系和此門課程的考試成績;然后再列出下一門課程的課程號和課程名,然后在此課程下列出選了此門課程且成績大于等于80的學(xué)生姓名、所在系和此門課程的考試成績;依此類推,直到列出全部課程。
58 declare show_course cursor for
59 select cno, cname
60 from course c
61 where cno in (select cno from sc)
62 order by cno
63 open show_course
64 declare @cno char(10), @cname char(20)
65 fetch next from show_course into @cno, @cname
66 while @@FETCH_STATUS = 0
67 begin
68 print @cno ' ' @cname
69 print '--------------'
70 declare show_student cursor for
71 select sname, sdept, grade
72 from student s, course c, sc
73 where s.sno = sc.sno and c.cno = sc.cno and c.cno = @cno and grade >= 80
74 open show_student
75 declare @sname char(10), @sdept char(10), @grade int
76 fetch next from show_student into @sname, @sdept, @grade
77 while @@fetch_status = 0
78 begin
79 print @sname ' ' @sdept ' ' convert(varchar(10), @grade)--注意類型轉(zhuǎn)換
80 fetch next from show_student into @sname, @sdept, @grade
81 end
82 close show_student
83 deallocate show_student
84 fetch next from show_course into @cno, @cname
85 end
86 close show_course
87 deallocate show_course
88 --例:把年齡為20歲的第三個(gè)學(xué)生的年齡改為18。
89 declare c scroll cursor for
90 select sno,sage from student
91 where sage=20
92 open c
93 fetch absolute 3 from c
94 update student
95 set sage=18
96 where current of c
97 close c
98 deallocate c
99 --違反了 PRIMARY KEY 約束“PK_student”。不能在對象“dbo.student”中插入重復(fù)鍵。重復(fù)鍵值為 (200515006)。
100
101 --例:把年齡為20歲的第五個(gè)學(xué)生從學(xué)生表中刪除。
102 declare delete_s scroll cursor for
103 select *
104 from student s
105 where sage = 20
106 open delete_s
107 fetch absolute 5 from delete_s
108 delete
109 from student
110 where current of delete_s
111 close delete_s
112 deallocate delete_s
113 --CURRENT OF cursor_name:
114 --表示當(dāng)前游標(biāo)指針?biāo)傅漠?dāng)前行數(shù)據(jù)。CURRENT OF 只能在UPDATE和DELETE語句中使用。
?
來源:https://www./content-4-560051.html
|