SqlServer SqlServer的游標使用

2021-09-07 19:08:36 字數 3773 閱讀 4348

結果集,結果集就是select查詢之後返回的所有行資料的集合。

游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多資料進行讀寫,也可以移動游標定位到你所需要的行中進行運算元據。

一般複雜的儲存過程,都會有游標的出現,他的用處主要有:

定位到結果集中的某一行。

對當前位置的資料進行讀寫。

可以對結果集中的資料單獨操作,而不是整行執行相同的操作。

是面向集合的資料庫管理系統和面向行的程式設計之間的橋梁。

根據游標檢測結果集變化的能力和消耗資源的情況不同,sql server支援的api伺服器游標分為一下4種:

靜態游標在滾動時檢測不到表資料變化,但消耗的資源相對很少。動態游標在滾動時能檢測到所有表資料變化,但消耗的資源卻較多。鍵集驅動游標則處於他們中間,所以根據需求建立適合自己的游標,避免資源浪費。。

游標的生命週期包含有五個階段:宣告游標、開啟游標、讀取游標資料、關閉游標、釋放游標。

1.宣告游標,語法

declare cursor_name cursor [local | global ] 

[forward_only | scroll ] [static | keyset | dynamic | fast_forward ] [read_only | scroll_locks | optimistic ] [type_warning ] forselect_statement [for update [ of column_name [ ,...n ]] ]

引數說明:

2.宣告乙個動態游標

declare ordernum_02_cursor cursorscroll

for select orderid from bigorder where ordernum='zeord003402'

3.開啟游標

--開啟游標語法

open [global ] cursor_name | cursor_variable_name

cursor_name:游標名,cursor_variable_name:游標變數名稱,該變數引用了乙個游標。

--開啟游標

open ordernum_02_cursor

4.提取資料

--提取游標語法

fetch

[[next|prior|frist|last|absoute n|relative n ] from] [global]cursor_name [into @variable_name[,....]]

引數說明:

例子:

--提取資料

fetch first fromordernum_02_cursor

fetch relative 3 fromordernum_02_cursor fetch next fromordernum_02_cursor fetch absolute 4 fromordernum_02_cursor fetch next fromordernum_02_cursor fetch last fromordernum_02_cursor fetch prior fromordernum_02_cursor select * from bigorder where ordernum='zeord003402'

結果(對比一下,就明白啦):

例子:

--提取資料賦值給變數

declare @orderid int

fetch absolute 3 from ordernum_02_cursor into @orderid select @orderid asid select * from bigorder where ordernum='zeord003402'

結果:

通過檢測全域性變數@@fetch_status的值,獲得提取狀態資訊,該狀態用於判斷fetch語句返回資料的有效性。當執行一條fetch語句之後,@@fetch_status可能出現3種值:0,fetch語句成功。-1:fetch語句失敗或行不在結果集中。-2:提取的行不存在。

這個狀態值可以幫你判斷提取資料的成功與否。

declare @orderid int

fetch absolute 3 from ordernum_02_cursor into @orderid while @@fetch_status=0 --提取成功,進行下一條資料的提取操作 begin select @orderid asid fetch next from ordernum_02_cursor into @orderid --移動游標 end

5.利用游標更新刪除資料

--游標修改當前資料語法

update 基表名 set 列名=值[,...] where current of游標名 --游標刪除當前資料語法 delete 基表名 where current of 游標名

---游標更新刪除當前資料---1.宣告游標

declare ordernum_03_cursor cursorscroll for select orderid ,userid from bigorder where ordernum='zeord003402' --2.開啟游標 openordernum_03_cursor --3.宣告游標提取資料所要存放的變數 declare @orderid int ,@userid varchar(15) --4.定位游標到哪一行 fetch first from ordernum_03_cursor into @orderid,@userid --into的變數數量必須與游標查詢結果集的列數相同 while @@fetch_status=0 --提取成功,進行下一條資料的提取操作 begin if @orderid=122182 begin update bigorder set userid='123' where current of ordernum_03_cursor --修改當前行 end if @orderid=154074 begin delete bigorder where current of ordernum_03_cursor --刪除當前行 end fetch next from ordernum_03_cursor into @orderid ,@userid --移動游標 end

6.關閉游標游標開啟後,伺服器會專門為游標分配一定的記憶體空間存放游標操作的資料結果集,同時使用游標也會對某些資料進行封鎖。所以游標一旦用過,應及時關閉,避免伺服器資源浪費。

--關閉游標語法

close [global ] cursor_name |cursor_variable_name --關閉游標 close ordernum_03_cursor

7.刪除游標刪除游標,釋放資源

--釋放游標語法

deallocate [global ] cursor_name |cursor_variable_name --釋放游標 deallocate ordernum_03_cursor

mysql游標使用範圍 MySql游標的使用例項

mysql游標使用的整個過程為 1.建立游標 複製 如下 declare calc bonus cursor for select id,salary,commission from employees 2.開啟游標 複製 如下 open calc bonus 3.使用游標 複製 如下 fetch ...

Oracle修煉路程 PL SQL之游標的使用

概念 游標又名游標,是乙個pl sql結構,利用游標可以命名這些工作區,並通過游標訪問工作區中的資訊。語法 cursor 游標名 引數列表 isselect。屬性 isopen 判斷游標是否開啟,所以第一步開啟游標 rowcount 判斷游標已經獲取資料的行數 found 和 notfound 判斷...

jQuery設定聚焦並使游標位置在文字最後

遇到乙個問題 表單輸入框設定了文字,然後使用jquery的焦點停留設定辦法focus 進行處理。結果發現游標位置在firefox下停留的位置不對 停留在文字的最前邊!只有ie瀏覽器下是正常的。這樣的話肯定是不行的,於是想辦法進行處理。有很多種,下面給出 方法一 function setselecti...