大型資料庫技術-實驗五-遊標的使用
阿新 • • 發佈:2020-12-06
大型資料庫技術-實驗五-遊標
五、 實驗內容及步驟
(1) 針對選課表定義一個只讀遊標,逐條輸出有成績的記錄的學號,開課號,成績(按成績由高到低排序)。要求遊標輸出資料時不反應開啟遊標後對基本表的修改。執行結果如下圖所示:
DECLARE CUR1 INSENSITIVE CURSOR FOR SELECT * FROM dbo.選課表 WHERE 成績 IS NOT NULL ORDER BY 成績 DESC OPEN CUR1 DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI INT FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI WHILE @@FETCH_STATUS=0 BEGIN PRINT '學號'+@XUEHAO PRINT '開課表'+@KAIKEHAO PRINT '成績'+CONVERT(VARCHAR(10),@CHENGJI) PRINT('-------------------------') FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI END CLOSE CUR1 DEALLOCATE CUR1 GO
(2) 針對選課表定義一個只讀遊標,逐條輸出有成績的記錄的學號,課程號,成績(按成績由高到低排序)。要求遊標輸出資料時反應開啟遊標後對基本表的修改。定義並開啟遊標後,通過其他連線將所有85的成績修改為80,再逐條輸出結果,執行結果如下圖所示:
(注意:建立遊標最好顯式指定引數,如果採用SQL-92標準定義,需要指定SCROLL,如果採用T-SQL標準定義,需要指定為SCROLL或DYNAMIC,否則遊標會預設建立為FAST_FORWARD,無法實現動態讀取)
DECLARE CUR1 CURSOR DYNAMIC FOR SELECT * FROM dbo.選課表 WHERE 成績 IS NOT NULL ORDER BY 成績 DESC FOR READ ONLY OPEN CUR1 DECLARE @XUEHAO VARCHAR(20),@KAIKEHAO VARCHAR(20),@CHENGJI INT FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI WHILE @@FETCH_STATUS=0 BEGIN PRINT '學號'+@XUEHAO PRINT '開課號'+@KAIKEHAO PRINT '成績'+CONVERT(VARCHAR(10),@CHENGJI) PRINT('---------------------------------') FETCH NEXT FROM CUR1 INTO @XUEHAO,@KAIKEHAO,@CHENGJI END CLOSE CUR1 DEALLOCATE CUR1 GO
(3) 針對學生表定義一個遊標,將遊標中絕對位置為3的學生姓名改為你的姓名,並將性別改為你的性別。
DECLARE CUR CURSOR SCROLL
FOR
SELECT * FROM dbo.學生表
OPEN CUR
FETCH ABSOLUTE 3 FROM CUR
IF(@@FETCH_STATUS=0)
UPDATE dbo.學生表 SET 姓名='張家林',性別='男' WHERE CURRENT OF CUR
CLOSE CUR
DEALLOCATE CUR
GO
(4) 針對選課表定義一個遊標,輸出最高成績記錄和最低記錄(如果有並列的,只需要輸出一條即可)。執行結果如下圖所示:
DECLARE CUR SCROLL CURSOR
FOR SELECT * FROM dbo.選課表
WHERE 成績 IS NOT NULL
ORDER BY 成績 DESC
OPEN CUR
FETCH FIRST FROM CUR
FETCH LAST FROM CUR
CLOSE CUR
DEALLOCATE CUR
GO
六、總結
這個實驗主要是針對遊標的使用方法。通過這次實驗我充分理解遊標的概念。並且掌握了遊標的定義以及使用遊標的方法。學會了用遊標解決比較複雜的問題。遊標在對錶結構進行讀取和修改功能都有著十分重要的作用,在定義的時候要注意遊標的屬性,是隻讀的還是可以修改的。遊標這部分還是得多加練習,要記住遊標的程式碼的邏輯,多背背就能記住。總之,這一部分內容還需要多敲程式碼才能運用的更加靈活,所以後面還需要多加練習。