日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)數(shù)據(jù)庫(kù)教程:MySQL游標(biāo)(Cursor)的定義及使用

在 MySQL 中,存儲(chǔ)過(guò)程或函數(shù)中的查詢有時(shí)會(huì)返回多條記錄,而使用簡(jiǎn)單的 SELECT 語(yǔ)句,沒(méi)有辦法得到第一行、下一行或前十行的數(shù)據(jù),這時(shí)可以使用游標(biāo)來(lái)逐條讀取查詢結(jié)果集中的記錄。游標(biāo)在部分資料中也被稱為光標(biāo)。

成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋服務(wù)器租用等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身設(shè)計(jì)品質(zhì)網(wǎng)站。

關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)質(zhì)是面向集合的,在 MySQL 中并沒(méi)有一種描述表中單一記錄的表達(dá)形式,除非使用 WHERE 子句來(lái)限制只有一條記錄被選中。所以有時(shí)我們必須借助于游標(biāo)來(lái)進(jìn)行單條記錄的數(shù)據(jù)處理。

一般通過(guò)游標(biāo)定位到結(jié)果集的某一行進(jìn)行數(shù)據(jù)修改。

結(jié)果集是符合 SQL 語(yǔ)句的所有記錄的集合。

個(gè)人理解游標(biāo)就是一個(gè)標(biāo)識(shí),用來(lái)標(biāo)識(shí)數(shù)據(jù)取到了什么地方,如果你了解編程語(yǔ)言,可以把他理解成數(shù)組中的下標(biāo)。

不像多數(shù) DBMS,MySQL 游標(biāo)只能用于存儲(chǔ)過(guò)程和函數(shù)。

 

下面介紹游標(biāo)的使用,主要包括游標(biāo)的聲明、打開(kāi)、使用和關(guān)閉。

1. 聲明游標(biāo)

MySQL 中使用
DECLARE 關(guān)鍵字來(lái)聲明游標(biāo),并定義相應(yīng)的 SELECT 語(yǔ)句,根據(jù)需要添加 WHERE 和其它子句。其語(yǔ)法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

其中,cursor_name 表示游標(biāo)的名稱;select_statement 表示 SELECT 語(yǔ)句,可以返回一行或多行數(shù)據(jù)。

例 1

下面聲明一個(gè)名為 nameCursor 的游標(biāo),代碼如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE processnames()
    -> BEGIN
    -> DECLARE nameCursor CURSOR
    -> FOR
    -> SELECT name FROM tb_student;
    -> END//
Query OK, 0 rows affected (0.07 sec)

以上語(yǔ)句定義了 nameCursor 游標(biāo),游標(biāo)只局限于存儲(chǔ)過(guò)程中,存儲(chǔ)過(guò)程處理完成后,游標(biāo)就消失了。

2. 打開(kāi)游標(biāo)

聲明游標(biāo)之后,要想從游標(biāo)中提取數(shù)據(jù),必須首先打開(kāi)游標(biāo)。在 MySQL 中,打開(kāi)游標(biāo)通過(guò)
OPEN 關(guān)鍵字來(lái)實(shí)現(xiàn),其語(yǔ)法格式如下:

OPEN cursor_name;

其中,cursor_name 表示所要打開(kāi)游標(biāo)的名稱。需要注意的是,打開(kāi)一個(gè)游標(biāo)時(shí),游標(biāo)并不指向第一條記錄,而是指向第一條記錄的前邊。

在程序中,一個(gè)游標(biāo)可以打開(kāi)多次。用戶打開(kāi)游標(biāo)后,其他用戶或程序可能正在更新數(shù)據(jù)表,所以有時(shí)會(huì)導(dǎo)致用戶每次打開(kāi)游標(biāo)后,顯示的結(jié)果都不同。

3. 使用游標(biāo)

游標(biāo)順利打開(kāi)后,可以使用 
FETCH...INTO 語(yǔ)句來(lái)讀取數(shù)據(jù),其語(yǔ)法形式如下:

FETCH cursor_name INTO var_name [,var_name]...

上述語(yǔ)句中,將游標(biāo) cursor_name 中 SELECT 語(yǔ)句的執(zhí)行結(jié)果保存到變量參數(shù) var_name 中。變量參數(shù) var_name 必須在游標(biāo)使用之前定義。使用游標(biāo)類似高級(jí)語(yǔ)言中的數(shù)組遍歷,當(dāng)?shù)谝淮问褂糜螛?biāo)時(shí),此時(shí)游標(biāo)指向結(jié)果集的第一條記錄。

MySQL 的游標(biāo)是只讀的,也就是說(shuō),你只能順序地從開(kāi)始往后讀取結(jié)果集,不能從后往前,也不能直接跳到中間的記錄。

4. 關(guān)閉游標(biāo)

游標(biāo)使用完畢后,要及時(shí)關(guān)閉,在 MySQL 中,使用
CLOSE 關(guān)鍵字關(guān)閉游標(biāo),其語(yǔ)法格式如下:

CLOSE cursor_name;

CLOSE 釋放游標(biāo)使用的所有內(nèi)部?jī)?nèi)存和資源,因此每個(gè)游標(biāo)不再需要時(shí)都應(yīng)該關(guān)閉。

在一個(gè)游標(biāo)關(guān)閉后,如果沒(méi)有重新打開(kāi),則不能使用它。但是,使用聲明過(guò)的游標(biāo)不需要再次聲明,用 OPEN 語(yǔ)句打開(kāi)它就可以了。

如果你不明確關(guān)閉游標(biāo),MySQL 將會(huì)在到達(dá) END 語(yǔ)句時(shí)自動(dòng)關(guān)閉它。游標(biāo)關(guān)閉之后,不能使用 FETCH 來(lái)使用該游標(biāo)。

例 2

創(chuàng)建 users 數(shù)據(jù)表,并插入數(shù)據(jù),SQL 語(yǔ)句和運(yùn)行結(jié)果如下:

mysql> CREATE TABLE `users`
    ->  (
    ->  `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->  `user_name` VARCHAR(60),
    ->  `user_pass` VARCHAR(64),
    ->  PRIMARY KEY (`ID`)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO users VALUES(null,'sheng','sheng123'),
    -> (null,'yu','yu123'),
    -> (null,'ling','ling123');
Query OK, 3 rows affected (0.01 sec)

創(chuàng)建存儲(chǔ)過(guò)程 test_cursor,并創(chuàng)建游標(biāo) cur_test,查詢 users 數(shù)據(jù)表中的第 3 條記錄,SQL 語(yǔ)句和執(zhí)行過(guò)程如下:

mysql> DELIMITER //
mysql> CREATE PROCEDURE test_cursor (in param INT(10),out result VARCHAR(90))
    -> BEGIN
    -> DECLARE name VARCHAR(20);
    -> DECLARE pass VARCHAR(20);
    -> DECLARE done INT;
    -> DECLARE cur_test CURSOR FOR SELECT user_name,user_pass FROM users;
    -> DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;
    -> IF param THEN INTO result FROM users WHERE id = param;
    -> ELSE
    -> OPEN cur_test;
    -> repeat
    -> FETCH cur_test into name,pass;
    -> SELECT concat_ws(',',result,name,pass) INTO result;
    -> until done
    -> END repeat;
    -> CLOSE cur_test;
    -> END IF;
    -> END //
Query OK, 0 rows affected (0.10 sec)

mysql> call test_cursor(3,@test)//
Query OK, 1 row affected (0.03 sec)

mysql> select @test//
+-----------+
| @test     |
+-----------+
| ling,ling123 |
+-----------+
1 row in set (0.00 sec)

創(chuàng)建 pro_users() 存儲(chǔ)過(guò)程,定義 cur_1 游標(biāo),將表 users 中的 user_name 字段全部修改為 MySQL,SQL 語(yǔ)句和執(zhí)行過(guò)程如下。

mysql> CREATE PROCEDURE pro_users()
    -> BEGIN
    -> DECLARE result VARCHAR(100);
    -> DECLARE no INT;
    -> DECLARE cur_1 CURSOR FOR SELECT user_name FROM users;
    -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET no=1;
    -> SET no=0;
    -> OPEN cur_1;
    -> WHILE no=0 do
    -> FETCH cur_1 into result;
    -> UPDATE users SET user_name='MySQL'
    -> WHERE user_name=result;
    -> END WHILE;
    -> CLOSE cur_1;
    -> END //
Query OK, 0 rows affected (0.05 sec)

mysql> call pro_users() //
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT * FROM users //
+----+-----------+-----------+
| ID | user_name | user_pass |
+----+-----------+-----------+
|  1 | MySQL     | sheng      |
|  2 | MySQL     | zhang     |
|  3 | MySQL     | ying      |
+----+-----------+-----------+
3 rows in set (0.00 sec)

結(jié)果顯示,users 表中的 user_name 字段已經(jīng)全部修改為 MySQL。


當(dāng)前名稱:創(chuàng)新互聯(lián)數(shù)據(jù)庫(kù)教程:MySQL游標(biāo)(Cursor)的定義及使用
文章路徑:http://www.5511xx.com/article/cogssjs.html