亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQL Server數(shù)據(jù)庫游標的基本操作指南

 更新時間:2023年11月15日 09:25:28   作者:菇毒  
這篇文章主要給大家介紹了關(guān)于SQL Server數(shù)據(jù)庫游標的基本操作指南,SQL Server游標是一種用于遍歷查詢結(jié)果集的數(shù)據(jù)庫對象,它可以逐行處理查詢結(jié)果,并執(zhí)行相關(guān)的操作,需要的朋友可以參考下

1. 聲明游標

游標主要由結(jié)果集合游標位置組成的,結(jié)果集是 SELECT 語句執(zhí)行后返回的,而游標位置是指向返回結(jié)果集中的指針;
使用游標前必須對游標進行聲明;

在 SQL Server 數(shù)據(jù)庫中,使用 DECLARE CURSOR 語句對游標進行聲明;

游標的聲明要對游標的滾動行為、游標所操作的結(jié)果集進行設(shè)置;

游標的聲明語法格式如下:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
    [ FORWARD_ONLY | SCROLL ]
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
    [ TYPE_WARNING ]
    FRO select_seatement
    [ FRO UPDATE [ OF column_name [,..n] ] ]
  • cursor_name:指定要聲明游標的名稱;
  • LOCAL:指定游標的作用域,LOCAL 表示游標的作用域局部;
  • FORWARD_ONLY:指定游標只能從第一個記錄向下滾動到最后一條記錄;
  • STATIC:定義一個游標使用數(shù)據(jù)的臨時副本,對游標的所有請求都通過 tempdb 中的臨時表得到應(yīng)答,提取數(shù)據(jù)時對該游標不能反映基表數(shù)據(jù)修改的結(jié)果;靜態(tài)游標不允許更改;
  • DYNAMIC:表示當游標滾動時,動態(tài)游標反映對結(jié)果集內(nèi)所有數(shù)據(jù)的更改;
  • KEYSET:指定打開游標時,游標中記錄順序和成員身份已被固定,對進行唯一標識的鍵集內(nèi)置在 tempdb 內(nèi)一個稱為 keyset
  • 的表中;
  • READ_ONLY|SCROLL_LOCKS|OPTIMISTIC:第一個參數(shù)表示游標為只讀游標,SCROLL_LOCKS 表示在使游標的結(jié)果集時放置鎖,當游標對數(shù)據(jù)進行讀取時,數(shù)據(jù)庫會對記錄進行鎖定,保證數(shù)據(jù)的一致性;OPTIMISTIC的作用在于通過游標讀取數(shù)據(jù),若讀取數(shù)據(jù)之后被更改,那么通過游標定位進行的更新和刪除操作不成功;
  • select_statement:指定游標所用結(jié)果集的 SELECT 語句;

注意:GROBAL 和 LOCAL 參數(shù)都未指定,默認值就由 default to local cursor 數(shù)據(jù)選項的設(shè)置控制;

例子1:聲明名稱為 cursor_B 的標準游標,如下所示:

declare cursor_B cursorfor select * from B

20220404

上述定義了一個名為 cursor_B 的游標,游標所操作的結(jié)果集從 SELECT 語句中得到;

例子2:聲明名稱為 cursor_B_read de 的只讀游標,如下所示:

declare cursor_B_read cursor
for select * from B
for read only

20220404

上述代碼中與標準的定義游標過程相比多出了 FOR READ ONLY 語句,表名該游標的記錄只能被讀取,不能進行被讀取,不能進行更改;

例子3:聲明名稱稱為 curesor_B_update 的更改標簽,如下所示:

declare cursor_B_update cursor
for select * from B
for update

20220404

2. 打開游標

使用 OPEN 語句打開 Transa-SQL 服務(wù)器游標,執(zhí)行 OPEN 語句的過程,按照 SELECT 語句填充數(shù)據(jù),當打開游標時,游標的位置在數(shù)據(jù)集的第一行,打開游標的語法格式如下:

OPEN [GLOBAL] cursor_name | cursor_variable _name

例子1:打開游標 cursor_B,如下所示:

open cursor_B

打開游標后,可進行數(shù)據(jù)操作;
打開全局游標:

open global cursor_B

打開游標是對數(shù)據(jù)庫進行一些 SQL SELECT 的操作,將耗費一段時間,取決于使用的系統(tǒng)性能和這條語句的復(fù)雜性;

3. 讀取游標中的數(shù)據(jù)

打開游標后就能讀取數(shù)據(jù)集中的記錄,用 FETCH 語句能對數(shù)據(jù)集總的數(shù)據(jù)進行某一行讀取;

FETCH 語法的格式如下:

FETCH
[ [ NEXT | PRIOR | FIRST | LAST 
| ABSOLUTE {n | @nvar}
| relative {n | @nvar}
]
FROM
]
{{ [ GLOBAL ] cursor_name } | @cursor_variable_name }
{ INTO @variable_name [,...n] }
  • NEXT:返回結(jié)果集中當前行的下一行記錄,若讀取的是第一行記錄,就返回第一行;NEXT 為默認的讀取選項;
  • PRIOR:返回結(jié)果集中當前行的一條記錄,若當前行的第一條記錄,就不返回,將游標定義到第一條記錄;
  • FIRST:返回結(jié)果集中的第一條記錄,并把第一行作為當前行;
  • LAST:返回結(jié)果集中的最后一條記錄,并把最后一行作為當前行;
  • ABSOLUTE n:若 n 為正數(shù),就返回從游標末尾開始的 n 行,并返回作為新的當前行;若 n 為負值,就返回從游標 末尾開始的第 n 行,并返回行為作為新的當前行;若 n 為 0,就返回當前行;
  • RELATIVE n:若 n 為正數(shù),就返回從當前行開始的第 n 行;若 n 為負數(shù),就返回當前行之前的第 n 行;若為 0,就返回當前行;
  • GLOBAL:指定游標的作用域為全局游標;
  • cursor_name:指定要打開游標的名稱;
  • INTO@variable_name[, ... n]:將記錄中提取的字段信息存儲到局部變量中;

例子 1:利用之前創(chuàng)建的游標 cursor_B_read 檢索 B表中的記錄

declare cursor_B_read cursor
for select * from B
open cursor_B_read
fetch next from cursor_B_read
while @@FETCH_STATUS = 0
begin
fetch next from cursor_B_read
end

20220404

在使用游標對數(shù)據(jù)進行讀取時可聲明一個游標變量,使用關(guān)鍵字 SET 對游標進行賦值;

對游標賦值的操作步驟:先創(chuàng)建一個游標,打開后將值賦予變量,最后通過 FETCH 語句從變量中讀取值;

例子 2:創(chuàng)建 cursor_S 游標,并將值賦予 @Mchr 游標變量

declare @Mchr cursor
declare cursor_S cursor for
select * from s;

open cursor_S
set @Mchr = cursor_S
fetch next from @Mchr
while @@FETCH_STATUS = 0
begin
fetch next from @Mchr
end

close @Mchr
deallocate @Mchr

20220404

先聲明了游標變量 @Mchr,再創(chuàng)建一個 cursor_S 游標打開游標后將值賦給 @Mchr,最后用 FEECH 讀取變量中的數(shù)據(jù)內(nèi)容;

FETCH 語法是游標使用的核心,使用游標能逐條記錄到查詢結(jié)果;已經(jīng)聲明并打開一個游標后,就能將數(shù)據(jù)放入任意的變量中;

在 FETCH 語句中,讀者能指定游標的名稱和目標的變量名稱;

注意: 若在 SELECT 語句中使用了 DISTINCT、UNION、GROUP BY 語句,且在選擇中包含了聚合表達式,游標就自動為 INSENSITIVE 的游標;

4. 關(guān)閉游標

SQL Server 數(shù)據(jù)庫在創(chuàng)建一個游標后,數(shù)據(jù)庫服務(wù)器會開辟一片存儲空間用于存放游標返回的數(shù)據(jù)集;在游標使用完后一定要養(yǎng)成關(guān)閉游標的習(xí)慣,這樣就能釋放服務(wù)器為游標開辟的內(nèi)存空間;

在處理完游標中的數(shù)據(jù)之后,用 CLOSE 命令能關(guān)閉一個已打開的游標;

語法格式如下:

CLOSE [ CLOBAL ] cursor_name | cursor_variable_naem

例子1:關(guān)閉名稱為 cursor_B 的游標

close cursor_B

游標可應(yīng)用在存儲過程、觸發(fā)器等中,若在聲明游標上與釋放游標之間使用了事務(wù)結(jié)構(gòu),在結(jié)束事務(wù)時游標就會自動關(guān)閉;

具體步驟如下:

  • 聲明一個游標;
  • 打開游標;
  • 讀取游標;
  • BEGIN TRANSATION
  • 數(shù)據(jù)處理;
  • COMMIT TRANSATION;

注意: 打開游標后,SQL Server 服務(wù)器會專門為游標開辟一定的內(nèi)存空間用于存放游標操作的數(shù)據(jù)結(jié)果集,同時游標的使用也會根據(jù)具體情況對某些數(shù)據(jù)進行封鎖;

所以在不使用游標時一定要關(guān)閉游標,以通知服務(wù)器釋放游標所占用的資源;

關(guān)閉游標后,可再次打開游標,在一個批處理中,也能多次打開和關(guān)閉游標;

5. 釋放游標

當用戶確定某個游標不再使用時,應(yīng)當即使使用 DEALLOCATE 命令釋放游標,SQL Server 將刪除這個游標的數(shù)據(jù)結(jié)構(gòu);

語法如下所示:

DEALLOCATE [GLOBAL]

游標被釋放后據(jù)不能再使用 OPEN 命令再次打開了;

關(guān)閉游標釋放游標的區(qū)別在于,關(guān)閉沒有把游標運行所占用的內(nèi)存空間釋放,若再次打開游標,還能照常使用,若是釋放,就是將游標占用的資源釋放;若再想使用游標,就必須重新建立;

總結(jié)

到此這篇關(guān)于SQL Server數(shù)據(jù)庫游標的基本操作指南的文章就介紹到這了,更多相關(guān)SQLServer游標基本操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論