- 遊標的使用
- 講了這個多遊標的優點,現在我們就親自來揭開遊標的神祕的面紗。
- 使用遊標的順序: 聲名遊標、打開遊標、讀取數據、關閉遊標、刪除遊標。
- 1.3.1聲明遊標
- 最簡單遊標聲明:DECLARE <遊標名>CURSOR FOR<SELECT語句>;
- 其中select語句可以是簡單查詢,也可以是複雜的接連查詢和嵌套查詢
- 例子:[已表2 AddSalary爲例子]
- Declare mycursor cursor for select * from AddSalary
- 這樣我就對錶AddSalary申明瞭一個遊標mycursor
- 【高級備註】
- DECLARE <遊標名> [INSENSITIVE] [SCROLL] CURSORFOR<SELECT語句>
- 這裏我說一下游標中級應用中的[INSENSITIVE]和[SCROLL]
- INSENSITIVE
- 表明MS SQL SERVER 會將遊標定義所選取出來的數據記錄存放在一臨時表內(建立在tempdb 數據庫下)。對該遊標的讀取操作皆由臨時表來應答。因此,對基本表的修改並不影響遊標提取的數據,即遊標不會隨着基本表內容的改變而改變,同時也無法通過遊標來更新基本表。如果不使用該保留字,那麼對基本表的更新、刪除都會反映到遊標中。
- 另外應該指出,當遇到以下情況發生時,遊標將自動設定INSENSITIVE 選項。
- a.在SELECT 語句中使用DISTINCT、 GROUP BY、 HAVING UNION 語句;
- b.使用OUTER JOIN;
- c.所選取的任意表沒有索引;
- d.將實數值當作選取的列。
- SCROLL
- 表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用該保留字,那麼只能進行NEXT 提取操作。由此可見,SCROLL 極大地增加了提取數據的靈活性,可以隨意讀取結果集中的任一行數據記錄,而不必關閉再
- 重開遊標。
- 1.3.2 打開遊標
- 非常簡單,我們就打開剛纔我們聲明的遊標mycursor
- OPEN mycursor
- 1.3.3讀取數據
- FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 遊標名 | @遊標變量名 } [ INTO @變量名 [,…] ]
- 參數說明:
- NEXT 取下一行的數據,並把下一行作爲當前行(遞增)。由於打開遊標後,行指針是指向該遊標第1行之前,所以第一次執行FETCH NEXT操作將取得遊標集中的第1行數據。NEXT爲默認的遊標提取選項。
- INTO @變量名[,…] 把提取操作的列數據放到局部變量中。列表中的各個變量從左到右與遊標結果集中的相應列相關聯。各變量的數據類型必須與相應的結果列的數據類型匹配或是結果列數據類型所支持的隱性轉換。變量的數目必須與遊標選擇列表中的列的數目一致。
- 現在我們就取出mycursor遊標的數據吧!
- 當遊標被打開時,行指針將指向該遊標集第1行之前,如果要讀取遊標集中的第1行數據,必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數據:
- Eg: Fetch next from mycursor 或則 Fetch first from mycursor
- 這樣我就取出了遊標裏的數據,但是光光這樣可不夠,我們還需要將取出的數據賦給變量
- --聲明2個變量
- declare @O_ID NVARCHAR(20)
- declare @A_Salary float
- --將取出的值傳入剛纔聲明的2個變量
- Fetch next from mycursor into @ O_ID,@ A_Salary
- 1.3.4關閉遊標
- CLOSE mycursor
- 1.3.5刪除遊標
- DEALLOCATE mycursor
- 1.3.6 實例訓練
- **/
- CREATE PROCEDURE PK_Test
- AS
- --聲明2個變量
- declare @O_ID nvarchar(20)
- declare @A_Salary float
- --聲明一個遊標mycursor,select語句中參數的個數必須要和從遊標取出的變量名相同
- declare mycursor cursor for select O_ID,A_Salary from AddSalary
- --打開遊標
- open mycursor
- --從遊標裏取出數據賦值到我們剛纔聲明的2個變量中
- fetch next from mycursor into @O_ID,@A_Salary
- --判斷遊標的狀態
- -- 0 fetch語句成功
- ---1 fetch語句失敗或此行不在結果集中
- ---2 被提取的行不存在
- while (@@fetch_status=0)
- begin
- --顯示出我們每次用遊標取出的值
- print '遊標成功取出一條數據'
- print @O_ID
- print @A_Salary
- --用遊標去取下一條記錄
- fetch next from mycursor into @O_ID,@A_Salary
- end
- --關閉遊標
- close mycursor
- --撤銷遊標
- DEALLOCATE mycursor
- GO
sqlserver遊標使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.