今天在寫存儲過程,想要測試一些東西,其中有一個表,需要插入100萬用戶,每個用戶有40行記錄,這裏面有兩個循環,想到了嵌套。
一般大家都知道for循環的嵌套,但是mysql存儲過程中只有三種循環while、repeat、loop。因爲一直使用while,所以就打算用while來做這件事情。結果發現,總是不能夠循環,直插入一個用戶的40行記錄,非常無語。代碼如下:
- DELIMITER $$
- USE `qqfs_db_items`$$
- DROP PROCEDURE IF EXISTS `qqsf_proc_InsertItemTest`$$
- CREATE PROCEDURE `qqsf_proc_InsertItemTest`(
- i_PlayerCount INT) COMMENT '插入道具表測試'
- BEGIN
- DECLARE a INT DEFAULT 1;
- DECLARE b TINYINT DEFAULT 1;
- WHILE (a <= i_PlayerCount) DO
- SET a = a + 1;
- WHILE (b <=40) DO
- INSERT INTO qqfs_tbl_items (AuthID,Slot,CID,GTID,Nums,Endtime,Flags,UseInfo)
- VALUES
- (a,b,0,0,1,NOW(),0,1);
- SET b = b + 1;
- END WHILE;
- END WHILE;
- END$$
- DELIMITER ;
後來用select a,select b,自定義查詢斷點發現循環是繼續的。網上查了下,貌似沒人說清楚。後來仔細一看,原來自己受了以前程序中for循環的束縛,以爲b的值總是會在第二次循環時被重置,其實b的值在一次循環之後,就已經變爲40了,所以,有兩種解決方法,一個是想程序中for循環一樣,將b的初始化放在a的循環中;另一種就是在a循環中,將b的值再次初始化爲1.
問題得到解決,新代碼如下:
- DELIMITER $$
- USE `qqfs_db_items`$$
- DROP PROCEDURE IF EXISTS `qqsf_proc_InsertItemTest`$$
- CREATE DEFINER=`root`@`%` PROCEDURE `qqsf_proc_InsertItemTest`(
- i_PlayerCount INT) COMMENT '插入道具表測試'
- BEGIN
- DECLARE a INT DEFAULT 1;
- DECLARE b TINYINT DEFAULT 1;
- WHILE (a <= i_PlayerCount) DO
- -- repeat
- SET a = a + 1;
- -- select a;
- WHILE (b <=40) DO
- INSERT INTO qqfs_tbl_items (AuthID,Slot,CID,GTID,Nums,Endtime,Flags,UseInfo)
- VALUES
- (a,b,0,0,1,NOW(),0,1);
- SET b = b + 1;
- -- select b;
- END WHILE;
- SET b = 1;
- -- select a;
- -- until a >= i_PlayerCount
- -- end repeat;
- END WHILE;
- END$$
- DELIMITER ;
包含了repeat的實現和我在排錯中給a和b打的select斷點。希望對大家有用。
----------------------------------------------------------------------------------------------------------------
我用第二種成功了。