以前一直不知道游標的作用,之前的結果集遍歷 博主一直用的是記錄查詢出來的記錄總數並一條條用LIMIT 1 OFFSET index 進行查找,並進行處理的。
現在終於會使用游標了,獻上一個小例子供大家參考。
其中的MySQL handler觸發器請大家參考以下博文 : http://blog.itpub.net/26952448/viewspace-731331/
其主要類型主要有以下幾種,以下就是對其詳細介紹,相信如果你掌握了這項技術,會在以后的學習或是工作中帶來很大的幫助。
1、 無返回結果語句,如:INSERT,UPDATE,DROP, DELETE等
2、 select語句返回單行變量並可傳給本地變量(select ..into)
3、 返回多行結果集的select語句,並可使用MySQL游標循環處理
注意,存儲過程返回的多行結果集,可以被客戶端程序(如php)所接收,但要在一個存儲過程中接收另一個存儲過程的結果集是不可能的,一般解決辦法是存入臨時表供其它過程共用
4、 prepare語句
以下主要講述游標及prepare部分
游標
定義
DECLARE cursor_name CURSOR FOR SELECT_statement;
游標操作
OPEN 打開游標
OPEN cursor_name;
FETCH 獲取游標當前指針的記錄,並傳給指定變量列表,注意變量數必須與MySQL游標返回的字段數一致,要獲得多行數據,使用循環語句去執行FETCH
FETCH cursor_name INTO variable list;
CLOSE關閉游標
CLOSE cursor_name ;
注意:MySQL的游標是向前只讀的,也就是說,你只能順序地從開始往后讀取結果集,不能從后往前,也不能直接跳到中間的記錄.
注意關閉游標再打開游標會回到結果集第一條記錄。故游標可以復用。
一個完整的小例子:
CREATE PROCEDURE testEndHandle()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE tmp_uid INT DEFAULT 0;
DECLARE tmp_uage INT DEFAULT 0;
DECLARE tmp_uname VARCHAR(255);
DECLARE t_index CURSOR FOR SELECT t_user.user_id, t_user.user_age, t_user.user_name FROM t_user;
-- 寫法一:DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 寫法二:DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN t_index;
REPEAT
FETCH t_index INTO tmp_uid,tmp_uage,tmp_uname;
IF done!=1 THEN
SELECT tmp_uid,tmp_uage,tmp_uname;
END IF;
UNTIL DONE END REPEAT;
CLOSE t_index;
END;
DROP PROCEDURE IF EXISTS testEndHandle;
call testEndHandle();
需要注意的是終止條件設置的位置。由於只有達到結果集的最后一條語句 再次執行FETCH才會設置done為1。
所以如果不像這樣設置會取出8條記錄,最后一條記錄會被重復取出
需要注意的代碼:
FETCH t_index INTO tmp_uid,tmp_uage,tmp_uname;
IF done!=1 THEN
SELECT tmp_uid,tmp_uage,tmp_uname;
END IF;
原文:https://blog.csdn.net/u010003835/article/details/50716610
自己實例:
DROP PROCEDURE IF EXISTS testEndHandle; delimiter $$ CREATE PROCEDURE testEndHandle() BEGIN DECLARE done BOOLEAN DEFAULT 0; DECLARE tmp_uid INT DEFAULT 0; DECLARE tmp_uage INT DEFAULT 0; DECLARE tmp_region VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; DECLARE t_index CURSOR FOR SELECT region from comsumer10 where country='中國' GROUP BY region; -- 寫法一:DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; -- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 寫法二:DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN t_index; REPEAT FETCH t_index INTO tmp_region; IF done!=1 THEN #create table results as SELECT country,region,city,count(*),sum(coin) from comsumer10 where region=tmp_region GROUP BY city ORDER BY sum(coin) desc; #insert into results SELECT country,region,city,count(*),sum(coin) from comsumer10 where region=tmp_region GROUP BY city ORDER BY sum(coin) desc; SELECT country,region,city,count(*),sum(coin) from comsumer10 where region=tmp_region GROUP BY city ORDER BY sum(coin) desc; END IF; UNTIL DONE END REPEAT; CLOSE t_index; END; $$ call testEndHandle(); #SELECT region from comsumer10 where country='中國' GROUP BY region;