mysql中的游標是什么?如何使用?


百度百科中的定義:

游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次一行或者多行前進或向后瀏覽數據的能力。可以把游標當作一個指針,它可以指定結果中的任何位置,然后允許用戶對指定位置的數據進行處理。

 

游標使用步驟:

一般地,使用游標都遵循下列的常規步驟: 
(1) 聲明游標。把游標與T-SQL語句的結果集聯系起來。 
(2) 打開游標。 
(3) 使用游標操作數據。 
(4) 關閉游標。 

 

    1. 如何使用游標: 
      一般地,使用游標都遵循下列的常規步驟: 
      (1) 聲明游標。把游標與T-SQL語句的結果集聯系起來。 
      (2) 打開游標。 
      (3) 使用游標操作數據。 
      (4) 關閉游標。 
      2.1. 聲明游標 
      DECLARE CURSOR語句SQL-92標准語法格式: 
      DECLARE 游標名 [ INSENSITIVE ] [ SCROLL ] CURSOR 
      FOR sql-statement 
      Eg: 
      Declare MycrsrVar Cursor 
      FOR Select * FROM tbMyData 
      2.2 打開游標 
      OPEN MycrsrVar 
      當游標被打開時,行指針將指向該游標集第1行之前,如果要讀取游標集中的第1行數據,必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數據: 
      FETCH FIRST from E1cursor 
      或 FETCH NEXT from E1cursor 
      2.3 使用游標操作數據 
      下面的示例用@@FETCH_STATUS控制在一個WHILE循環中的游標活動 
      /* 使用游標讀取數據的操作如下。*/ 
      DECLARE E1cursor cursor /* 聲明游標,默認為FORWARD_ONLY游標 */ 
      FOR SELECT * FROM c_example 
      OPEN E1cursor /* 打開游標 */ 
      FETCH NEXT from E1cursor /* 讀取第1行數據*/ 
      WHILE @@FETCH_STATUS = 0 /* 用WHILE循環控制游標活動 */ 
      BEGIN 
      FETCH NEXT from E1cursor /* 在循環體內將讀取其余行數據 */ 
      END

CLOSE E1cursor /* 關閉游標 */ 
DEALLOCATE E1cursor /* 刪除游標 */

2.4 關閉游標 
使用CLOSE語句關閉游標 
CLOSE { { [ GLOBAL ] 游標名 } | 游標變量名 } 
使用DEALLOCATE語句刪除游標,其語法格式如下: 
DEALLOCATE { { [ GLOBAL ] 游標名 } | @游標變量名 
3. FETCH操作的簡明語法如下: 
FETCH 
[ NEXT | PRIOR | FIRST | LAST] 
FROM 
{ 游標名 | @游標變量名 } [ INTO @變量名 [,…] ]

參數說明:

NEXT 取下一行的數據,並把下一行作為當前行(遞增)。由於打開游標后,行指針是指向該游標第1行之前,所以第一次執行FETCH NEXT操作將取得游標集中的第1行數據。NEXT為默認的游標提取選項。

INTO @變量名[,…] 把提取操作的列數據放到局部變量中。列表中的各個變量從左到右與游標結果集中的相應列相關聯。各變量的數據類型必須與相應的結果列的數據類型匹配或是結果列數據類型所支持的隱性轉換。變量的數目必須與游標選擇列表中的列的數目一致。


每執行一個FETCH操作之后,通常都要查看一下全局變量@@FETCH_STATUS中的狀態值,以此判斷FETCH操作是否成功。該變量有三種狀態值:

? 0 表示成功執行FETCH語句。

? -1 表示FETCH語句失敗,例如移動行指針使其超出了結果集。

? -2 表示被提取的行不存在。

由於@@FETCH_STATU是全局變量,在一個連接上的所有游標都可能影響該變量的值。因此,在執行一條FETCH語句后,必須在對另一游標執行另一FETCH 語句之前測試該變量的值才能作出正確的判斷。

更新數據; 
declare my_youbiao cursor 
for select * from t_msg 
for update

open my_youbiao 
fetch next from my_youbiao 
while @@fetch_status=0 
begin 
–update t_msg set msg=’1234567890’ where current of my_youbiao 
update my_youbiao set msg=’123’ where current of my_youbiao 
fetch next from my_youbiao 
print ‘asdfasd11’ 
end 
close my_youbiao 
deallocate my_youbiao 
print ‘asdfasd’

測試通過:

–select * from master..sysprocesses 
use test 
declare my_cursor cursor scroll dynamic –scroll表示可以向前或向后移動 dynamic:表示可寫也可讀, 
for 
select F3 from temp –定義my_cursor 游標

open my_cursor –打開游標 
declare @name nvarchar(128) –定義一個變量 
fetch next from my_cursor into @name –游標停在第一條記錄前面,第一次執行,測試有沒有記錄存在 
while(@@fetch_status=0) –取數據,直到-2即沒有記錄 
begin 
print ‘姓名: ’ + @name 
–fetch next from my_cursor 
fetch next from my_cursor into @name 
end

–fetch first from my_cursor into @name 
print @name 
–update temp set F9=’zzg’ where current of my_cursor 
/*// delete from 個人資料 where current of my_cursor */ 
close my_cursor 
deallocate my_cursor

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM