1.1游標的概念 游標(Cursor)它使用戶可逐行訪問由SQL Server返回的結果集。使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索數據後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL serv ...
1.1游標的概念
游標(Cursor)它使用戶可逐行訪問由SQL Server返回的結果集。使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索數據後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL server內逐行地訪問這些記錄,按照用戶自己的意願來顯示和處理這些記錄。
1.2 游標的優點
從游標定義可以得到游標的如下優點,這些優點使游標在實際應用中發揮了重要作用:
1)允許程式對由查詢語句select返回的行集合中的每一行執行相同或不同的操作,而不是對整個行集合執行同一個操作。
2)提供對基於游標位置的表中的行進行刪除和更新的能力。
3)游標實際上作為面向集合的資料庫管理系統(RDBMS)和麵向行的程式設計之間的橋梁,使這兩種處理方式通過游標溝通起來。
1.3 游標的使用
講了這個多游標的優點,現在我們就親自來揭開游標的神秘的面紗。
使用游標的順序: 聲名游標、打開游標、讀取數據、關閉游標、刪除游標。
1.3.1聲明游標
最簡單游標聲明:DECLARE <游標名>CURSOR FOR;
其中select語句可以是簡單查詢,也可以是複雜的接連查詢和嵌套查詢
例子:[已表2 AddSalary為例子]
Declare mycursor cursor for select * from AddSalary 這樣我就對錶AddSalary申明瞭一個游標mycursor
【高級備註】
DECLARE <游標名> [INSENSITIVE] [SCROLL] CURSORFOR 這裡我說一下游標中級應用中的[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
轉載自:https://blog.csdn.net/shang_111111/article/details/8183737。