MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。由于其社區(qū)版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發(fā)環(huán)境。

一、游標
有時,需要在檢索出來的行中前進或者后退一行或多行。這就是使用游標的原因。游標是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結(jié)果集。在存儲了游標之后,應(yīng)用程序可以根據(jù)需要滾動或瀏覽其中的數(shù)據(jù)。
游標主要用于交互式應(yīng)用,其中用戶需要滾動屏幕上的數(shù)據(jù),并對數(shù)據(jù)進行瀏覽或做出更改。
二、使用游標
使用游標及幾個明確的步驟:
(1)在能夠使用游標前,必須聲明(定義)它。這個過程實際上沒有檢索數(shù)據(jù),它只是定義要使用的SELECT語句。
(2)一旦聲明后,必須打開游標以供使用。這個過程用前面定義的SELECT語句把數(shù)據(jù)實際檢索出來。
(3)對于填有數(shù)據(jù)的游標,根據(jù)需要取出(檢索)各行。
(4)在結(jié)束游標使用時,必須關(guān)閉游標
1.創(chuàng)建游標
游標用DECLARE語句創(chuàng)建。DECLARE命名游標,并定
義相應(yīng)的SELECT語句,根據(jù)需要帶WHERE和其他子句。例如,以下語句定義了名為ordernumbers的游標,使用了可以檢索所有訂單的SELECT語句。
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
DECLARE語句用來定義和命名游標,這里為ordernumbers。存儲過程處理完成后,游標就消失(因為它局限于存儲過程)。
2.打開和關(guān)閉游標
游標用OPEN CURSOR語句來打開:
OPEN ordernumbers;
在處理OPEN語句時執(zhí)行查詢,存儲檢索出的數(shù)據(jù)以供瀏覽和滾動。游標處理完成后,應(yīng)該使用如下語句關(guān)閉游標:
CLOSE ordernumbers;
下面是上述例子的修改版本:
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
CLOSE ordernumbers;
END;
這個存儲過程聲明、打開和關(guān)閉一個游標。但對檢索出來的數(shù)據(jù)什么也沒做。
3.使用游標數(shù)據(jù)
從游標中檢索單個行(第一行):
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END;
其中FETCH用來檢索當(dāng)前行的order_num列(將自動從第一行開始)到一個名為o的局部聲明的變量中。對檢索出來的數(shù)據(jù)不做任何處理。
循環(huán)檢索數(shù)據(jù),從第一行到最后一行:
CREATE PROCEDURE processorders()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END;
其中FETCH用來檢索當(dāng)前行的order_num列到一個名為o的局部聲明的變量中。FETCH在REPEAT內(nèi),因此它反復(fù)執(zhí)行直到done為真(由UNTIL done END REPEAT;規(guī)定)。為了使它起作用,用一個DEFAULT 0(假,不結(jié)束)定義變量done。以下的語句可以將done設(shè)置為真:
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
這條語句定義了一個DECLARE CONTINUE,它是在條件出現(xiàn)時被執(zhí)行的代碼。這里,它指出當(dāng)SQLSTATE '02000' 出現(xiàn)時,SET done=1。SQLSTATE '02000' 是一個未找到條件。當(dāng)REPEAT由于沒有更多的行供循環(huán)而不能繼續(xù)時,出現(xiàn)這個條件。
如果調(diào)用這個存儲過程,它將定義幾個變量和一個CONTINUE HANDLER,定義并打開一個游標,重復(fù)讀取所有行,然后關(guān)閉游標。如果一切正常,可以在循環(huán)內(nèi)放入任意需要的處理(在 FETCH 語句之后,循環(huán)結(jié)束之前)。