MySQL——使用游標(十七)

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用來檢索當前行的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用來檢索當前行的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í)行的代碼。這里恋拷,它指出當SQLSTATE '02000' 出現(xiàn)時资厉,SET done=1。SQLSTATE '02000' 是一個未找到條件蔬顾。當REPEAT由于沒有更多的行供循環(huán)而不能繼續(xù)時宴偿,出現(xiàn)這個條件。

如果調(diào)用這個存儲過程诀豁,它將定義幾個變量和一個CONTINUE HANDLER窄刘,定義并打開一個游標,重復(fù)讀取所有行舷胜,然后關(guān)閉游標娩践。如果一切正常,可以在循環(huán)內(nèi)放入任意需要的處理(在 FETCH 語句之后,循環(huán)結(jié)束之前)翻伺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末材泄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吨岭,更是在濱河造成了極大的恐慌拉宗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辣辫,死亡現(xiàn)場離奇詭異旦事,居然都是意外死亡,警方通過查閱死者的電腦和手機络它,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門族檬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人化戳,你說我怎么就攤上這事单料。” “怎么了点楼?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵扫尖,是天一觀的道長。 經(jīng)常有香客問我掠廓,道長换怖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任蟀瞧,我火速辦了婚禮沉颂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悦污。我一直安慰自己铸屉,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布切端。 她就那樣靜靜地躺著彻坛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踏枣。 梳的紋絲不亂的頭發(fā)上昌屉,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音茵瀑,去河邊找鬼间驮。 笑死,一個胖子當著我的面吹牛马昨,可吹牛的內(nèi)容都是我干的蜻牢。 我是一名探鬼主播烤咧,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抢呆!你這毒婦竟也來了煮嫌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抱虐,失蹤者是張志新(化名)和其女友劉穎昌阿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳邀,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡懦冰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谣沸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷钢。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乳附,靈堂內(nèi)的尸體忽然破棺而出内地,到底是詐尸還是另有隱情,我是刑警寧澤赋除,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布阱缓,位于F島的核電站,受9級特大地震影響举农,放射性物質(zhì)發(fā)生泄漏荆针。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一颁糟、第九天 我趴在偏房一處隱蔽的房頂上張望航背。 院中可真熱鬧,春花似錦棱貌、人聲如沸沃粗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至突雪,卻和暖如春起惕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咏删。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工喳篇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羹铅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親命爬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容