日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

10、游标(Cursor)的定义及使用

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10、游标(Cursor)的定义及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 MySQL 中,存儲過程或函數中的查詢有時會返回多條記錄,而使用簡單的 SELECT 語句,沒有辦法得到第一行、下一行或前十行的數據,這時可以使用游標來逐條讀取查詢結果集中的記錄。游標在部分資料中也被稱為光標。

關系數據庫管理系統實質是面向集合的,在 MySQL 中并沒有一種描述表中單一記錄的表達形式,除非使用 WHERE 子句來限制只有一條記錄被選中。所以有時我們必須借助于游標來進行單條記錄的數據處理。

一般通過游標定位到結果集的某一行進行數據修改。

結果集是符合 SQL 語句的所有記錄的集合。

個人理解游標就是一個標識,用來標識數據取到了什么地方,如果你了解編程語言,可以把他理解成數組中的下標。

不像多數 DBMS,MySQL 游標只能用于存儲過程和函數。

下面介紹游標的使用,主要包括游標的聲明、打開、使用和關閉。

1. 聲明游標(游標只存在于存儲過程中)

MySQL 中使用 DECLARE 關鍵字來聲明游標,并定義相應的 SELECT 語句,根據需要添加 WHERE 和其它子句。其語法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

其中,cursor_name 表示游標的名稱;
select_statement 表示 SELECT 語句,可以返回一行或多行數據。

例 1
下面聲明一個名為 nameCursor 的游標,代碼如下:

mysql> DELIMITER // mysql> CREATE PROCEDURE processnames() 創建存儲過程-> BEGIN-> DECLARE nameCursor CURSOR 聲明游標-> FOR-> SELECT name FROM tb_student;-> END//

以上語句定義了 nameCursor 游標,游標只局限于存儲過程中,存儲過程處理完成后,游標就消失了。

2. 打開游標

聲明游標之后,要想從游標中提取數據,必須首先打開游標。在 MySQL 中,打開游標通過 OPEN 關鍵字來實現,其語法格式如下:

OPEN cursor_name;

其中,cursor_name 表示所要打開游標的名稱。需要注意的是,打開一個游標時,游標并不指向第一條記錄,而是指向第一條記錄的前邊

在程序中,一個游標可以打開多次。用戶打開游標后,其他用戶或程序可能正在更新數據表,所以有時會導致用戶每次打開游標后,顯示的結果都不同。

3. 使用游標

游標順利打開后,可以使用 FETCH...INTO 語句來讀取數據,其語法形式如下:

FETCH cursor_name INTO var_name [,var_name]...

上述語句中,將游標 cursor_name 中 SELECT 語句的執行結果保存到變量參數 var_name 中。變量參數 var_name 必須在游標使用之前定義。使用游標類似高級語言中的數組遍歷,當第一次使用游標時,此時游標指向結果集的第一條記錄。

MySQL 的游標是只讀的,也就是說,你只能順序地從開始往后讀取結果集,不能從后往前,也不能直接跳到中間的記錄。

4. 關閉游標

游標使用完畢后,要及時關閉,在 MySQL 中,使用 CLOSE 關鍵字關閉游標,其語法格式如下:

CLOSE cursor_name;

CLOSE 釋放游標使用的所有內部內存和資源,因此每個游標不再需要時都應該關閉。

在一個游標關閉后,如果沒有重新打開,則不能使用它。但是,使用聲明過的游標不需要再次聲明,用 OPEN 語句打開它就可以了。

如果你不明確關閉游標,MySQL 將會在到達 END 語句時自動關閉它。游標關閉之后,不能使用 FETCH 來使用該游標。

例 2
創建 student 數據表,并插入數據,SQL 語句和運行結果如下:

create table student(stuId int primary key auto_increment,stuName varchar(20),stuSex varchar(2),stuAge int )default charset=utf8; insert into student(stuName,stuSex,stuAge) values ('小明','男',20), ('小花','女',19), ('大赤','男',20), ('可樂','男',19), ('瑩瑩','女',19);?

創建存儲過程 test_cursor,并創建游標 cur_test,查詢 users 數據表中的第 3 條記錄,SQL 語句和執行過程如下:

delimiter // create procedure p1() begindeclare id int;declare name varchar(100) character set utf8;declare done int default 0;-- 聲明游標declare mc cursor for select stuId,stuName from student where stuAge >19;declare continue handler for not found set done = 1;-- 打開游標open mc;-- 獲取結果fetch mc into id,name;-- 這里是為了顯示獲取結果select id,name;-- 關閉游標close mc; end // delimiter ;

試使用 三種方式 使用游標創建一個存儲過程,統計年齡大于19的記錄的數量

Loop循環

-- 定義語法結束符號 delimiter // -- 創建一個 名稱為 p2 的存儲過程 create procedure p2() begin-- 創建 用于接收游標值的變量declare id,age,total int;-- 注意 接收游標值為中文時 需要 給變量 指定 字符集為utf8declare name,sex varchar(20) character set utf8;-- 游標結束的標志declare done int default 0;-- 聲明游標declare cur cursor for select stuId,stuName,stuSex,stuAge from student where stuAge > 19;-- 指定游標循環結束時的返回值 declare continue handler for not found set done =1;-- 打開游標open cur;-- 初始化 變量set total = 0;-- loop 循環xxx:loop-- 根據游標當前指向的一條數據 fetch cur into id,name,sex,age;-- 當 游標的返回值為 1 時 退出 loop循環 if done = 1 thenleave xxx;end if;-- 累計set total = total + 1;end loop;-- 關閉游標close cur;-- 輸出 累計的結果select total; end // delimiter ;

while 循環

delimiter /-- 創建一個 名稱為 p3 的存儲過程create procedure p3()

delimiter // -- 創建一個 名稱為 p3 的存儲過程 create procedure p3() begin-- 創建 用于接收游標值的變量declare id,age,total int;-- 注意 接收游標值為中文時 需要 給變量 指定 字符集為utf8declare name,sex varchar(20) character set utf8;-- 游標結束的標志declare done int default 0;-- 聲明游標declare cur cursor for select stuId,stuName,stuSex,stuAge from student where stuAge > 19;-- 指定游標循環結束時的返回值 declare continue handler for not found set done = 1;-- 打開游標open cur;-- 初始化 變量set total = 0;-- while 循環while done != 1 dofetch cur into id,name,sex,age;if done != 1 thenset total = total + 1;end if; end while;-- 關閉游標close cur;-- 輸出 累計的結果select total; end // delimiter ;

repeat 循環

delimiter // -- 創建一個 名稱為 p3 的存儲過程 create procedure p3() begin-- 創建 用于接收游標值的變量declare id,age,total int;-- 注意 接收游標值為中文時 需要 給變量 指定 字符集為utf8declare name,sex varchar(20) character set utf8;-- 游標結束的標志declare done int default 0;-- 聲明游標declare cur cursor for select stuId,stuName,stuSex,stuAge from student where stuAge > 19;-- 指定游標循環結束時的返回值 declare continue handler for not found set done = 1;-- 打開游標open cur;-- 初始化 變量set total = 0;-- repeat 循環repeatfetch cur into id,name,sex,age;if done != 1 thenset total = total + 1;end if;until done = 1end repeat;-- 關閉游標close cur;-- 輸出 累計的結果select total; end // delimiter ;

總結

以上是生活随笔為你收集整理的10、游标(Cursor)的定义及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。