在數據庫中,游標是一個十分重要的概念。游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標總是與一條SQL? 選擇語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的游標。如果曾經用 C 語言寫過對文件進行處理的程序,那么游標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對于游標而言,其道理是相同的??梢娪螛四軌驅崿F按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。
游標允許應用程序對查詢語句select? 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基于游標位置而對表中數據進行刪除或更新的能力;而且,正是游標把作為面向集合的數據庫管理系統和面向行的程序設計兩者聯系起來,使兩個數據處理方式能夠進行溝通。
一,什么是游標(cursor)
個人覺得就是一個cursor,就是一個標識,用來標識數據取到什么地方了。你也可以把它理解成數組中的下標。
二,游標(cursor)的特性
1,只讀的,不能更新的。
2,不滾動的
3,不敏感的
游標(cursor)必須在聲明處理程序之前被聲明,并且變量和條件必須在聲明游標或處理程序之前被聲明。
三,游標的使用
1.數據庫中創建函數 ----- 點擊函數中的創建函數
2.彈出如下窗口,設置函數名(比如:syf)
3.然后在查詢框會自動生成代碼
```
```
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.續寫自己需要的代碼
```
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`;? /*首先這里對游標進行定義*/
DECLARE? CONTINUE HANDLER FOR NOT FOUND? SET? no_more_record = 1;/*這個是個條件處理,針對NOT FOUND的條件,當沒有記錄時賦值為1*/
OPEN? cur_record;/*接著使用OPEN打開游標*/
-- 開始循環
read_loop: LOOP
-- 提取游標里的數據,這里只有一個,多個的話也一樣;
FETCH? cur_record INTO user_username, user_money;/*把第一行數據寫入變量中,游標也隨之指向了記錄的第一行*/
-- 聲明結束的時候
-- 注意:這里的循環體可以根據自己的需要設定(while,while...do,if...then等等)
IFno_more_record = 1THEN
LEAVE read_loop;
END IF;
-- 這里做你想做的循環的事件
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.開始執行:執行完成后的結果是這樣
表示執行成功了!
6.刷新數據庫或者直接打開存儲過程,會看到一個syf的文件,然后執行這個創建的函數syf,
CALL syf();
最終的數據結果表中會出現a=3318;這樣游標也就執行完成了.