1. 程式人生 > 資料庫 >大型資料庫技術-實驗五-遊標的使用

大型資料庫技術-實驗五-遊標的使用

大型資料庫技術-實驗五-遊標

五、 實驗內容及步驟
(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

六、總結
這個實驗主要是針對遊標的使用方法。通過這次實驗我充分理解遊標的概念。並且掌握了遊標的定義以及使用遊標的方法。學會了用遊標解決比較複雜的問題。遊標在對錶結構進行讀取和修改功能都有著十分重要的作用,在定義的時候要注意遊標的屬性,是隻讀的還是可以修改的。遊標這部分還是得多加練習,要記住遊標的程式碼的邏輯,多背背就能記住。總之,這一部分內容還需要多敲程式碼才能運用的更加靈活,所以後面還需要多加練習。