新聞中心
從字面可以這么理解什么是游標(biāo),游標(biāo)就像是水面上漂浮的一個(gè)標(biāo)記,這個(gè)標(biāo)記可以來(lái)回游動(dòng),一會(huì)游到這里一會(huì)游到那里,這里的河水可以理解為是數(shù)據(jù)的集合,這個(gè)標(biāo)記就是在這些數(shù)據(jù)間來(lái)回游動(dòng)。

目前創(chuàng)新互聯(lián)建站已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、內(nèi)江網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
為什么 MySQL 會(huì)有游標(biāo)這個(gè)概念,由于 SQL 語(yǔ)言是面向集合的語(yǔ)句,它每次查詢出來(lái)都是一堆數(shù)據(jù)的集合,沒(méi)有辦法對(duì)其中一條記錄進(jìn)行單獨(dú)的處理。如果要對(duì)每條記錄進(jìn)行單獨(dú)處理就需要游標(biāo)。
游標(biāo)其實(shí)就像是編程語(yǔ)言中的 for/foreach 循環(huán),把一個(gè)數(shù)組(數(shù)據(jù)的集合)中每條數(shù)據(jù)一條一條地循環(huán)出來(lái),然后你在 for/foreach 循環(huán)中使用判斷語(yǔ)句對(duì)你感興趣的數(shù)據(jù)進(jìn)行處理。
哪里可以使用游標(biāo)呢,函數(shù),存儲(chǔ)過(guò)程,觸發(fā)器中都可以使用。
說(shuō)完概念,就來(lái)看下游標(biāo)的固定寫(xiě)法。不管概念是否理解,記住下面的固定模式也可以完成搬磚任務(wù)。
1、聲明游標(biāo)
DECLARE 游標(biāo)名字 CURSOR FOR SELECT 語(yǔ)句;
SELECT 語(yǔ)句就是正常的查詢語(yǔ)句,例如:SELECT id,age FROM table;
2、打開(kāi)游標(biāo)
OPEN 游標(biāo)名字;
在打開(kāi)游標(biāo)之前,游標(biāo)定義的 SQL 語(yǔ)句是不執(zhí)行的。
3、取出記錄
FETCH 游標(biāo)名字 INTO 變量1[,變量2,變量3];
將當(dāng)前的記錄數(shù)據(jù)存入變量。
當(dāng) FETCH 沒(méi)有找到記錄時(shí)會(huì)拋出異常,異常的定義需要下面的 HANDLER FOR 語(yǔ)句。
聲明游標(biāo)語(yǔ)句中的 SELECT 如果有多個(gè)字段,INTO 后面需要多個(gè)變量進(jìn)行接收。
4、設(shè)置結(jié)束條件
DECLARE 處理種類 HANDLER FOR 異常的類型 異常發(fā)生時(shí)的處理
這個(gè)語(yǔ)句的作用是指定一個(gè)條件,告訴程序所有數(shù)據(jù)已經(jīng)循環(huán)完畢,可以結(jié)束了。由于游標(biāo)是使用 WHILE 循環(huán)進(jìn)行每條數(shù)據(jù)的讀取,就需要給 WHILE 一個(gè)結(jié)束條件。
處理種類:可以是, EXIT 立即結(jié)束。CONTINUE 繼續(xù)下面的處理。
異常的類型:一般指定為 NOT FOUND ,意思是沒(méi)有找到任何數(shù)據(jù)。
異常發(fā)生時(shí)的處理:當(dāng)異常發(fā)生時(shí)需要做的事情,這里一般改變一個(gè)變量的值來(lái)記錄異常已經(jīng)發(fā)生了,如如 SET flat = 1 詳細(xì)用法查看下面的例子。
5、關(guān)閉游標(biāo)
CLOSE 游標(biāo)名字;
實(shí)戰(zhàn)代碼:
CREATE PROCEDURE sp_abc()
BEGIN
-- 定義一個(gè)臨時(shí)存放使用逗號(hào)分割的所有客戶名字的變量
DECLARE result VARCHAR(1000) DEFAULT '';
-- 定義一個(gè) flag 變量,用來(lái)判斷記錄是否全部取出,我這里設(shè)置,1代表沒(méi)有記錄,0代表還有記錄。
DECLARE flag INT DEFAULT 0;
-- 定義一個(gè)存放當(dāng)前記錄客戶名字的臨時(shí)變量
DECLARE tmp VARCHAR(50) DEFAULT '';
-- 定義游標(biāo),在打開(kāi)游標(biāo)之前,這個(gè)SELECT語(yǔ)句是不執(zhí)行的
DECLARE cur CURSOR FOR SELECT `name` FROM kefu;
-- 設(shè)置結(jié)束條件,當(dāng)沒(méi)有記錄的時(shí)候拋出 NOT FOUND 異常,并設(shè)置 flag 等于1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
-- 打開(kāi)游標(biāo)
OPEN cur;
-- 定義循環(huán),從游標(biāo)中一條一條的取出記錄
WHILE flag != 1 DO
-- 將 SELECT 語(yǔ)句當(dāng)前行中的 name 字段保存到 tmp 變量中
-- 如果 SELECT 指定多個(gè)字段,INTO 后面就需要跟多個(gè)變量,例如:tmp1,tmp2,每個(gè)變量單獨(dú)存放一個(gè)字段的值
FETCH cur INTO tmp;
-- 這里需要判斷一下,因?yàn)樯厦娑x異常發(fā)生后繼續(xù)處理 CONTINUE ,當(dāng) FETCH 發(fā)生異常時(shí) tmp 沒(méi)有得到正確的值。所以 IF 內(nèi)的語(yǔ)句塊不應(yīng)該被執(zhí)行。
IF flag != 1 THEN
SET result = CONCAT_WS(',',result ,tmp);
END IF;
END WHILE;
-- 關(guān)閉游標(biāo)
CLOSE cur;
-- 最后你可以根據(jù)你的情況來(lái)處理這個(gè) result 變量了
SELECT result;
END;
完畢,看懂沒(méi),如果沒(méi)看懂沒(méi)關(guān)系,游標(biāo)處理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。
文章題目:MySQL游標(biāo)的定義與使用
文章鏈接:http://www.dlmjj.cn/article/cdeggje.html


咨詢
建站咨詢
