本章將講授什么是游標(biāo)以及如何使用游標(biāo)炒辉。
游標(biāo)
有時(shí)候栏尚,需要在檢索出來(lái)的行中前進(jìn)或后退一行或多行。
這就是使用游標(biāo)的原因用狱。
游標(biāo)是一個(gè)存儲(chǔ)在MySQL服務(wù)器上的數(shù)據(jù)庫(kù)查詢(xún),它不是一條SELECT語(yǔ)句拼弃,而是被該語(yǔ)句檢索出來(lái)的結(jié)果集夏伊。
在存儲(chǔ)了游標(biāo)之后,應(yīng)用程序可以根據(jù)需要滾動(dòng)或?yàn)g覽其中的數(shù)據(jù)吻氧。
使用游標(biāo)
使用游標(biāo)涉及幾個(gè)明確的步驟:
- 在能夠使用游標(biāo)前溺忧,必須聲明(定義)它咏连。這個(gè)過(guò)程實(shí)際上沒(méi)有檢索數(shù)據(jù),它只是定義要使用的SELECT語(yǔ)句鲁森。
- 一旦聲明后祟滴,必須打開(kāi)游標(biāo)以供使用。這個(gè)過(guò)程用前面定義的SELECT語(yǔ)句把數(shù)據(jù)實(shí)際檢索出來(lái)歌溉。
- 對(duì)于填有數(shù)據(jù)的游標(biāo)垄懂,根據(jù)需要取出(檢索)各行。
- 在結(jié)束游標(biāo)使用時(shí)痛垛,必須關(guān)閉游標(biāo)草慧。
在聲明游標(biāo)后,可根據(jù)需要頻繁地打開(kāi)和關(guān)閉游標(biāo)匙头。
在游標(biāo)打開(kāi)后漫谷,可根據(jù)需要頻繁地執(zhí)行取操作。
創(chuàng)建游標(biāo)
游標(biāo)用 DECLARE 語(yǔ)句創(chuàng)建乾胶。
DECLARE 命名游標(biāo)抖剿,并定義相應(yīng)的 SELECT 語(yǔ)句。
例子:
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
END;
在定義游標(biāo)之后识窿,可以打開(kāi)它斩郎。
打開(kāi)和關(guān)閉游標(biāo)
游標(biāo)用 OPEN CURSOR 語(yǔ)句來(lái)打開(kāi);
例子:
OPEN ordernumbers;
游標(biāo)處理完成后喻频,應(yīng)當(dāng)使用如下語(yǔ)句關(guān)閉游標(biāo):
CLOSE ordernumbers;
CLOSE 釋放游標(biāo)使用的所有內(nèi)部?jī)?nèi)存和資源缩宜,因此在每個(gè)游標(biāo)不再需要時(shí)都應(yīng)該關(guān)閉
例子:
CREATE PROCEDURE processorders()
BEGIN
-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
-- Open the cursor
OPEN ordernumbers;
-- Close the cursor
CLOSE ordernumbers;
END;
這個(gè)存儲(chǔ)過(guò)程聲明、打開(kāi)和關(guān)閉一個(gè)游標(biāo)甥温。但對(duì)檢索出的數(shù)據(jù)沒(méi)做什么操作锻煌。
使用游標(biāo)數(shù)據(jù)
在一個(gè)游標(biāo)被打開(kāi)后,可以使用 FETCH 語(yǔ)句分別訪問(wèn)它的每一行姻蚓。
FETCH 指定檢索什么數(shù)據(jù)(所需的列)宋梧,檢索出來(lái)的數(shù)據(jù)存儲(chǔ)在什么地方。
它還會(huì)向前移動(dòng)游標(biāo)中的內(nèi)部行指針狰挡,使下一條 FETCH 語(yǔ)句檢索下一行(不重復(fù)讀取同一行)
例子捂龄,從游標(biāo)中檢索單個(gè)行(第一行):
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
END;
在定義游標(biāo)之后,可以打開(kāi)它加叁。
打開(kāi)和關(guān)閉游標(biāo)
游標(biāo)用 OPEN CURSOR 語(yǔ)句來(lái)打開(kāi)倦沧;
例子:
OPEN ordernumbers;
游標(biāo)處理完成后,應(yīng)當(dāng)使用如下語(yǔ)句關(guān)閉游標(biāo):
CLOSE ordernumbers;
CLOSE 釋放游標(biāo)使用的所有內(nèi)部?jī)?nèi)存和資源它匕,因此在每個(gè)游標(biāo)不再需要時(shí)都應(yīng)該關(guān)閉
例子:
CREATE PROCEDURE processorders()
BEGIN
-- Declare local variables
DECLARE o INT;
-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
-- Open the cursor
OPEN ordernumbers;
-- Get order number
FETCH ordernumbers INTO o;
-- Close the cursor
CLOSE ordernumbers;
END;
FETCH 用來(lái)檢索當(dāng)前行的 order_num 列(將自動(dòng)從第一行開(kāi)始)到一個(gè)名為 o 的局部聲明的變量中展融。對(duì)檢索出的數(shù)據(jù)不做任何處理。
例子豫柬,循環(huán)檢索數(shù)據(jù)告希,從第一行到最后一行:
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
END;
在定義游標(biāo)之后扑浸,可以打開(kāi)它。
打開(kāi)和關(guān)閉游標(biāo)
游標(biāo)用 OPEN CURSOR 語(yǔ)句來(lái)打開(kāi)暂雹;
例子:
OPEN ordernumbers;
游標(biāo)處理完成后首装,應(yīng)當(dāng)使用如下語(yǔ)句關(guān)閉游標(biāo):
CLOSE ordernumbers;
CLOSE 釋放游標(biāo)使用的所有內(nèi)部?jī)?nèi)存和資源,因此在每個(gè)游標(biāo)不再需要時(shí)都應(yīng)該關(guān)閉
例子:
CREATE PROCEDURE processorders()
BEGIN
-- Declare ocal variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_nm FROM orders;
-- Declare continue handler
DECLARE CONTINUE HANDLEAR FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN ordernumbers;
-- Loop through all rows
REPEAT
-- Get order number
FETCH ordernumbers INTO o;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE ordernumbers;
END;
與前一個(gè)例子不一樣的是杭跪,這個(gè)例子中的 FETCH 是在 REPEAT 內(nèi)仙逻,因此它反復(fù)執(zhí)行直到 done 為真(由 UNTIL done END REPEAT; 規(guī)定)。
為使它起作用涧尿,用一個(gè) DEFAULT 0(假系奉,不結(jié)束)定義變量 done。
done 怎樣才能在結(jié)束時(shí)被設(shè)置為真呢姑廉?
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
這條語(yǔ)句定義了一個(gè) CONTINUE HANDLER缺亮,它是在條件出現(xiàn)時(shí)被執(zhí)行的代碼。
當(dāng) SQLSTATE '02000' 出現(xiàn)時(shí)桥言,SET done=1萌踱。
SQLSTATE '02000' 是一個(gè)未找到條件,當(dāng) REPEAT 由于沒(méi)有更多的行供循環(huán)而不能繼續(xù)時(shí)号阿,出現(xiàn)這個(gè)條件并鸵。