游標是sql 的一種資料訪問機制 ,游標是一種處理資料的方法。眾所周知,使用sql的select查詢操作返回的結果是乙個包含一行或者是多行的資料集,如果我們要對查詢的結果再進行查詢,比如(檢視結果的第一行、下一行、最後一行、前十行等等操作)簡單的通過select語句是無法完成的,因為這時候索要查詢的結果不是資料表,而是已經查詢出來的結果集。游標就是針對這種情況而出現的。
我們可以將「 游標 」簡單的看成是結果集的乙個指標,可以根據需要在結果集上面來回滾動,瀏覽我需要的資料。
1、定義游標
2、開啟游標
3、使用游標
4、關閉游標
5、釋放游標
1、宣告游標——declare cursorname cursor
語法如下:
declare cursor_name corsor [ local | global] [ forward_only | scroll ] [ static | keyset | dynamic | fast_forward ] [ read_only | scroll_locks | optimistic ] [ type_warning ]
forslect查詢的相關語句
上面的彩色字型表示的是,宣告游標時的選項,不是必須提供的,每乙個都代表游標的相關選項和特性
(1)local:對於在其中建立批處理、儲存過程或觸發器來說,該游標的作用域是區域性的。global:指定該游標的作用域是全域性的
(2)forward_only:指定游標只能從第一行滾動到最後一行。否則預設為forward_only。scroll表示游標可以來回滾動
(3)static:定義乙個游標,以建立將又該游標使用的資料臨時複本,對游標的所有請求都從tempdb中的這以臨時表中不得到應答;因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改。
keyset:指定當游標開啟時,游標重的行的成員身份和順序已經固定。對行進行唯一標識的鍵值內建在tempdb內乙個稱為keyset的表中。
dynamic:定義乙個游標,以反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值、順序和成員身份在每次提取時都會更改,動態游標不支援absolute提取選項。
fast_forward:指定啟動了效能優化的forward_only、read_only游標。如果指定了scroll或for_update,則不能指定fast_forward。
scroll_locks:指定通過游標進行的定位更新或刪除一定會成功。將行讀入游標時sql server將鎖定這些行,以確保隨後可對它們進行修改,如果還指定了fast_forward或static,則不能指定scroll_locks。
optimistic:指定如果行自讀入游標以來已得到更新,則通過游標進行的定位更新或定位刪除不成功。當將行讀入游標時,sql server不鎖定行,它改用timestamp列值比較結果來確定行讀入游標後是否發生了修改,如果表不包含timestamp列,它改用校驗和值進行確定,如果以修改該行,則嘗試進行的定位更新或刪除將失敗,如果還指定了fast_forward,則不能指定optimistic。
type_warning:指定游標從所請求的型別隱式轉換為另一種型別時,向客戶端傳送警告訊息。
2、開啟游標——open cursorname
3、取出資料——fetch…from
fetch [ next | prior | first | last | absolute | relative ] from cursorname
[ into @variable_name [ ,…n ] ]
next:緊跟當前行返回結果行,並且當前行遞增為返回行,如果fetch next為對游標的第一次提取操作,則返回結果集中的第一行。next為預設的游標提取選項。
prior:返回緊鄰當前行前面的結果行,並且當前行遞減為返回行,如果fetch prior為對游標的第一次提取操作,則沒有行返回並且游標置於第一行之前。
first:返回游標中的第一行並將其作為當前行。
last:返回游標中的最後一行並將其作為當前行。
absolute :如果n或@nvar為正,則返回從游標頭開始向後n行的第n行,並將返回行變成新的當前行。如果n或@nvar為負,則返回從游標末尾開始向前的n行的第n行,並將返回行變成新的當前行。如果n或@nvar為0,則不返回行。n必須是整數常量,並且@nvar的資料型別必須為int、tinyint或smallint.
relative :如果n或@nvar為正,則返回從當前行開始向後的第n行。如果n或@nvar為負,則返回從當前行開始向前的第n行。如果n或@nvar為0,則返回當前行,對游標第一次提取時,如果在將n或@nvar設定為負數或0的情況下指定fetch relative,則不返回行,n必須是整數常量,@nvar的資料型別必須是int、tinyint或smallint.
global:指定cursor_name是全域性游標。
cursor_name:已宣告的游標的名稱。如果全域性游標和區域性游標都使用cursor_name作為其名稱,那麼如果指定了global,則cursor_name指的是全域性游標,否則cursor_name指的是區域性游標。
@cursor_variable_name:游標變數名,引用要從中進行提取操作的開啟的游標。
into @variable_name [ ,…n ]:允許將提取操作的列資料放到區域性變數中。列表中的各個變數從左到右與游標結果集中的相應列相關聯。各變數的資料型別必須與相應的結果集列的資料型別相匹配,或是結果集列資料型別所支援的隱士轉換。變數的數目必須與游標選擇列表中的列數一致。
4、關閉游標——close cursorname
5、刪除游標——deallocate cursorname
use pubs
godeclare @auid char(12),@aulname varchar(20),@aufname varchar(20), @st char(2),@auinfo varchar(50)
declare auth_cur cursor for
select au_id, au_lname, au_fname, state
from authors
open auth_cur
fetch next from auth_cur into @auid,@aulname,@aufname, @st
while (@@fetch_status=0)
begin
print '作者編號: '+@auid
print '作者姓名: '+@aulname+','+@aufname
print '所在州: '+@st
print '--------------------------'
fetch next from auth_cur into @auid,@aulname,@aufname, @st
endclose auth_cur
deallocate auth_cur
資料庫游標
資料庫之 游標 轉貼 在資料庫開發過程中,當你檢索的資料只是一條記錄時,你所編寫的事務語句 往往使用select insert 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。1.游標和游標的優點 在資料庫中,游標...
資料庫游標
資料庫游標 2007 10 10 15 40 游標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。游標總是與一條t sql 選擇語句相關聯因為游標由結果集 可以是零條 一條或由相關的選擇語句檢索出的多條記錄 和結果集...
資料庫游標
1.為何使用游標 使用游標 cursor 的乙個主要的原因就是把集合操作轉換成單個記錄處理方式。用sql語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是乙個含有多個記錄的集合。游標機制允許使用者在sql server內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。2...