提到MySQL游標(biāo),多半在存儲(chǔ)過(guò)程中定義及使用。
以下說(shuō)明摘自MySQL官網(wǎng):
MySQL 支持存儲(chǔ)程序中的游標(biāo)。語(yǔ)法與嵌入式 SQL 中的一樣。游標(biāo)具有以下屬性:
- 不敏感:服務(wù)器可能會(huì)也可能不會(huì)復(fù)制其結(jié)果表
- 只讀:不可更新
- 不可滾動(dòng):只能單向遍歷,不能跳行
游標(biāo)聲明必須出現(xiàn)在處理程序聲明之前以及變量和條件聲明之后。
游標(biāo)申明語(yǔ)法:
DECLARE cursor_name CURSOR FOR select_statement
cursor_name:定義的游標(biāo)名稱(chēng)
select_statement:SQL查詢(xún)語(yǔ)句
此語(yǔ)句聲明一個(gè)游標(biāo)并將其與?SELECT檢索要由游標(biāo)遍歷的行的語(yǔ)句相關(guān)聯(lián)。要稍后獲取行,請(qǐng)使用FETCH語(yǔ)句。語(yǔ)句檢索的列數(shù)?SELECT必須與語(yǔ)句中指定的輸出變量數(shù)相匹配?FETCH。
該SELECT語(yǔ)句不能有
INTO
子句。游標(biāo)聲明必須出現(xiàn)在處理程序聲明之前以及變量和條件聲明之后。
存儲(chǔ)的程序可能包含多個(gè)游標(biāo)聲明,但在給定塊中聲明的每個(gè)游標(biāo)必須具有唯一的名稱(chēng)。
對(duì)于通過(guò)?SHOW語(yǔ)句可用的信息,在許多情況下可以通過(guò)將游標(biāo)與
INFORMATION_SCHEMA
表一起使用來(lái)獲得等效信息。
Cursor FETCH語(yǔ)法:
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
此語(yǔ)句獲取與指定游標(biāo)(必須打開(kāi))關(guān)聯(lián)的語(yǔ)句的下一行?SELECT,并推進(jìn)游標(biāo)指針。如果存在一行,則提取的列存儲(chǔ)在命名變量中。語(yǔ)句檢索的列數(shù)?SELECT必須與語(yǔ)句中指定的輸出變量數(shù)相匹配?FETCH。
如果沒(méi)有更多行可用,則出現(xiàn) No Data 條件,SQLSTATE value?
'02000'
。要檢測(cè)此條件,您可以為其(或條件)設(shè)置一個(gè)處理程序?NOT FOUND
。請(qǐng)注意,另一個(gè)操作(例如 a?
SELECT
或 another?FETCH
)也可能通過(guò)引發(fā)相同條件來(lái)導(dǎo)致處理程序執(zhí)行。如果有必要區(qū)分哪個(gè)操作引發(fā)了條件,請(qǐng)將該操作放在它自己的?BEGIN ... END塊中,以便它可以與它自己的處理程序相關(guān)聯(lián)。
游標(biāo)的開(kāi)啟及關(guān)閉,必須成對(duì)出現(xiàn),語(yǔ)法:
open cursor_name;
close cursor_name;
定義一個(gè)游標(biāo)的完整語(yǔ)法示例:
CREATE PROCEDURE curdemo(IN in_id varchar(32))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1 where id=in_id;
DECLARE cur2 CURSOR FOR SELECT id,data FROM test.t2 where id=in_id;
# 申明游標(biāo)遍歷結(jié)束的標(biāo)記
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
# 打開(kāi)游標(biāo)
OPEN cur1;
OPEN cur2;
# 遍歷游標(biāo)
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;# 如果遍歷結(jié)束,退出循環(huán)
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
# 關(guān)閉游標(biāo)
CLOSE cur1;
CLOSE cur2;
END;
寫(xiě)在最后的踩坑點(diǎn):
1.申明游標(biāo)時(shí),必須定義一個(gè)完整的SQL查詢(xún)語(yǔ)句。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-426902.html
MySQL官網(wǎng)游標(biāo)(cursor)說(shuō)明文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426902.html
到了這里,關(guān)于MySQL游標(biāo)(cursor)定義及使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!