mysql while循環嵌套

今天在寫存儲過程,想要測試一些東西,其中有一個表,需要插入100萬用戶,每個用戶有40行記錄,這裏面有兩個循環,想到了嵌套。

一般大家都知道for循環的嵌套,但是mysql存儲過程中只有三種循環while、repeat、loop。因爲一直使用while,所以就打算用while來做這件事情。結果發現,總是不能夠循環,直插入一個用戶的40行記錄,非常無語。代碼如下:

 

  1. DELIMITER $$ 
  2.  
  3. USE `qqfs_db_items`$$ 
  4.  
  5. DROP PROCEDURE IF EXISTS `qqsf_proc_InsertItemTest`$$ 
  6.  
  7. CREATE  PROCEDURE `qqsf_proc_InsertItemTest`( 
  8.  i_PlayerCount INT) COMMENT '插入道具表測試' 
  9.  BEGIN 
  10.   DECLARE a INT DEFAULT 1; 
  11.   DECLARE b TINYINT DEFAULT 1; 
  12.   WHILE (a <= i_PlayerCount) DO 
  13.     
  14.    SET a = a + 1; 
  15.    WHILE (b <=40) DO 
  16.     INSERT INTO qqfs_tbl_items (AuthID,Slot,CID,GTID,Nums,Endtime,Flags,UseInfo) 
  17.     VALUES 
  18.     (a,b,0,0,1,NOW(),0,1); 
  19.     SET b = b + 1; 
  20.    END WHILE; 
  21.       END WHILE; 
  22.  END$$ 
  23.  
  24. DELIMITER ; 

後來用select a,select b,自定義查詢斷點發現循環是繼續的。網上查了下,貌似沒人說清楚。後來仔細一看,原來自己受了以前程序中for循環的束縛,以爲b的值總是會在第二次循環時被重置,其實b的值在一次循環之後,就已經變爲40了,所以,有兩種解決方法,一個是想程序中for循環一樣,將b的初始化放在a的循環中;另一種就是在a循環中,將b的值再次初始化爲1.

問題得到解決,新代碼如下:


 
  1. DELIMITER $$ 
  2.  
  3. USE `qqfs_db_items`$$ 
  4.  
  5. DROP PROCEDURE IF EXISTS `qqsf_proc_InsertItemTest`$$ 
  6.  
  7. CREATE DEFINER=`root`@`%` PROCEDURE `qqsf_proc_InsertItemTest`( 
  8.  i_PlayerCount INT) COMMENT '插入道具表測試' 
  9.  BEGIN 
  10.   DECLARE a INT DEFAULT 1; 
  11.   DECLARE b TINYINT DEFAULT 1; 
  12.   WHILE (a <= i_PlayerCount) DO 
  13.   -- repeat 
  14.     
  15.     
  16.    SET a = a + 1; 
  17.    -- select a; 
  18.    WHILE (b <=40) DO 
  19.     INSERT INTO qqfs_tbl_items (AuthID,Slot,CID,GTID,Nums,Endtime,Flags,UseInfo) 
  20.     VALUES 
  21.     (a,b,0,0,1,NOW(),0,1); 
  22.     SET b = b + 1; 
  23.     -- select b; 
  24.    END WHILE; 
  25.     
  26.    SET b = 1; 
  27.    -- select a; 
  28.    -- until a >= i_PlayerCount 
  29.   -- end repeat; 
  30.    END WHILE; 
  31.  END$$ 
  32.  
  33. DELIMITER ; 

包含了repeat的實現和我在排錯中給a和b打的select斷點。希望對大家有用。

----------------------------------------------------------------------------------------------------------------

我用第二種成功了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章