遊標概念
資料庫操作中我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?遊標為我們提供了一種極為優秀的解決方案。
遊標(cursor)是系統為使用者開設的一個資料緩衝區,存放SQL語句的執行結果。
每個遊標區都有一個名字。使用者可以用SQL語句逐一從遊標中擷取記錄,並賦給主變數,交由主語言進一步處理。遊標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,遊標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。
遊標總是與一條SQL 查詢語句相關聯因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置群組成。
當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標。如果曾經用C 語言寫過對檔案進行處理的程式,那麼遊標就像您開啟檔案所得到的檔案控制代碼一樣,只要檔案開啟成功,該檔案控制代碼就可代表該檔案。對於遊標而言,其道理是相同的。可見遊標能夠實現按與傳統程式讀取一般檔案類似的方式處理來自基礎資料表的結果集,從而把表中資料以一般檔案的形式呈現給程式。
我們知道關聯式資料庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。
因此我們必須藉助於遊標來進行面向單條記錄的資料處理。由此可見,遊標允許應用程式對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於遊標位置而對錶中資料進行刪除或更新的能力;而且,正是遊標把作為面向集合的資料庫管理系統和面向行的程式設計兩者聯絡起來,使兩個資料處理方式能夠進行溝通。
遊標的使用一般是這樣,個人理解:定義遊標-->開啟遊標-->Fetch next from into --> where @@fech_status=0(這個類似C語言中的指標) -->Fetch next from into -->end -->關閉遊標(close 遊標名)-->Deallocate 遊標
具體案例:
定義遊標 Test_Cursor ,
declare @paraA nvarchar(50)--定義參數
declare @paraB nvarchar(50)--定義參數
declare @paraC nvarchar(50)--定義參數
declare Test_Cursor cursor local for--定義遊標
開啟遊標 ,定義要遊標的結果集
--相當於要遍曆的表內容
select
tableA_columnA,
tableA_columnB,
tableA_columnC
from tableA
--相當於將指標指向這個表頭,指向該資料表集的第一條記錄,
open Test_Cursor fetch next from Test_Cursor into
@paraA,
@paraB,
@paraC
while @@fetch_status=0
迴圈遍曆資料集中的內容,一條條做
begin
insert into
tableB(
tableB_columnA,
tableB_columnB,
tableB_columnC)
values(
@paraA,
@paraB,
@paraC)
fetch next from Test_Cursor into
@paraA,
@paraB,
@paraC
end
關閉和收尾回收記憶體
close Test_Cursor
deallocate Test_Cursor