mysql for循環遍歷 游標用處


以前一直不知道游標的作用,之前的結果集遍歷 博主一直用的是記錄查詢出來的記錄總數並一條條用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;

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM