在數(shù)據(jù)庫中,游標(biāo)是一個(gè)十分重要的概念。游標(biāo)提供了一種對(duì)從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段举户,就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制遍烦。游標(biāo)總是與一條SQL? 選擇語句相關(guān)聯(lián)因?yàn)橛螛?biāo)由結(jié)果集(可以是零條俭嘁、一條或由相關(guān)的選擇語句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對(duì)結(jié)果集進(jìn)行處理時(shí)服猪,必須聲明一個(gè)指向該結(jié)果集的游標(biāo)供填。如果曾經(jīng)用 C 語言寫過對(duì)文件進(jìn)行處理的程序,那么游標(biāo)就像您打開文件所得到的文件句柄一樣罢猪,只要文件打開成功近她,該文件句柄就可代表該文件。對(duì)于游標(biāo)而言膳帕,其道理是相同的粘捎。可見游標(biāo)能夠?qū)崿F(xiàn)按與傳統(tǒng)程序讀取平面文件類似的方式處理來自基礎(chǔ)表的結(jié)果集危彩,從而把表中數(shù)據(jù)以平面文件的形式呈現(xiàn)給程序攒磨。
游標(biāo)允許應(yīng)用程序?qū)Σ樵冋Z句select? 返回的行結(jié)果集中每一行進(jìn)行相同或不同的操作,而不是一次對(duì)整個(gè)結(jié)果集進(jìn)行同一種操作恬砂;它還提供對(duì)基于游標(biāo)位置而對(duì)表中數(shù)據(jù)進(jìn)行刪除或更新的能力咧纠;而且,正是游標(biāo)把作為面向集合的數(shù)據(jù)庫管理系統(tǒng)和面向行的程序設(shè)計(jì)兩者聯(lián)系起來泻骤,使兩個(gè)數(shù)據(jù)處理方式能夠進(jìn)行溝通漆羔。
一,什么是游標(biāo)(cursor)
個(gè)人覺得就是一個(gè)cursor,就是一個(gè)標(biāo)識(shí)狱掂,用來標(biāo)識(shí)數(shù)據(jù)取到什么地方了演痒。你也可以把它理解成數(shù)組中的下標(biāo)。
二趋惨,游標(biāo)(cursor)的特性
1,只讀的鸟顺,不能更新的。
2,不滾動(dòng)的
3,不敏感的
游標(biāo)(cursor)必須在聲明處理程序之前被聲明器虾,并且變量和條件必須在聲明游標(biāo)或處理程序之前被聲明讯嫂。
三,游標(biāo)的使用
1.數(shù)據(jù)庫中創(chuàng)建函數(shù) ----- 點(diǎn)擊函數(shù)中的創(chuàng)建函數(shù)
2.彈出如下窗口兆沙,設(shè)置函數(shù)名(比如:syf)
3.然后在查詢框會(huì)自動(dòng)生成代碼
```
```
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `jingluovip`.`syf`()
RETURNS TYPE
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
```
--這里寫自己的代碼
END$$
DELIMITER ;
```
4.續(xù)寫自己需要的代碼
```
DELIMITER $$
USE `jingluovip`$$
DROP PROCEDURE IF EXISTS `syf`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `syf`
BEGIN
DECLARE? no_more_record INT DEFAULT 0;
DECLARE? a INT DEFAULT 1;
DECLARE? user_username VARCHAR(50);
DECLARE? user_money FLOAT(12,2);
DECLARE? cur_record CURSOR FOR? SELECT username, money FROM `jingluovip`.`sinbegin_user`;? /*首先這里對(duì)游標(biāo)進(jìn)行定義*/
DECLARE? CONTINUE HANDLER FOR NOT FOUND? SET? no_more_record = 1;/*這個(gè)是個(gè)條件處理,針對(duì)NOT FOUND的條件,當(dāng)沒有記錄時(shí)賦值為1*/
OPEN? cur_record;/*接著使用OPEN打開游標(biāo)*/
-- 開始循環(huán)
read_loop: LOOP
-- 提取游標(biāo)里的數(shù)據(jù)欧芽,這里只有一個(gè),多個(gè)的話也一樣葛圃;
FETCH? cur_record INTO user_username, user_money;/*把第一行數(shù)據(jù)寫入變量中,游標(biāo)也隨之指向了記錄的第一行*/
-- 聲明結(jié)束的時(shí)候
-- 注意:這里的循環(huán)體可以根據(jù)自己的需要設(shè)定(while,while...do,if...then等等)
IFno_more_record = 1THEN
LEAVE read_loop;
END IF;
-- 這里做你想做的循環(huán)的事件
UPDATE `dg_users` SET `j_price`=user_money WHERE `username`=user_username ;
SET a = a+1;
END LOOP;
CLOSE? cur_record;? /*用完后記得用CLOSE把資源釋放掉*/
SELECT a;
END$$
DELIMITER ;
```
5.開始執(zhí)行:執(zhí)行完成后的結(jié)果是這樣
表示執(zhí)行成功了千扔!
6.刷新數(shù)據(jù)庫或者直接打開存儲(chǔ)過程憎妙,會(huì)看到一個(gè)syf的文件,然后執(zhí)行這個(gè)創(chuàng)建的函數(shù)syf,
CALL syf();
最終的數(shù)據(jù)結(jié)果表中會(huì)出現(xiàn)a=3318;這樣游標(biāo)也就執(zhí)行完成了.