日期:2014-05-16  浏览次数:20769 次

各位大侠帮帮我啊!
SQL code

DELIMITER $$

DROP PROCEDURE IF EXISTS `data_test`.`gps`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `gps`()
BEGIN
    DECLARE i int DEFAULT 1; 
    DECLARE j int DEFAULT 1; 
    declare k datetime default '2011-01-01 00:00:00';        
    WHILE j<=100 DO
    while i<=86400 do 
                INSERT INTO T_devdata_gps_20110101(f_devid,f_longitude,f_latitude,f_speed,f_direction,f_gpstime,f_instime)   
                        VALUES(CONCAT('f_devid',j),concat('f_longitude',j+0.2),concat('f_latitude',j+0.3),concat('f_speed',j+1),concat('f_direction',j+4),k,k);    
    set k = (SELECT DATE_ADD(k,INTERVAL 1 SECOND));
    set i = i+1;
    end while;    
    set j = j+1;
    set k = '2011-01-01 00:00:00';    
    END WHILE;
    END$$



这个是我写的mysql的存储过程,我的意思是想让他进行两重循环,但是外层的循环没有执行,这个为什么啊,很急,帮帮我!

------解决方案--------------------
SQL code

CREATE DEFINER=`root`@`localhost` PROCEDURE `gps`()
BEGIN
    DECLARE i int DEFAULT 1; 
    DECLARE j int DEFAULT 1; 
    declare k datetime default '2011-01-01 00:00:00';        
    WHILE j<=100 DO
    SET I=1;  # 需要在这里给内层循环的值归位,要么I全局一次后就是86400了,下面就不再循环了。楼主看到的其实是内层循环只做了一次,外层循环是正常的。
    while i<=86400 do 
                INSERT INTO T_devdata_gps_20110101(f_devid,f_longitude,f_latitude,f_speed,f_direction,f_gpstime,f_instime)   
                        VALUES(CONCAT('f_devid',j),concat('f_longitude',j+0.2),concat('f_latitude',j+0.3),concat('f_speed',j+1),concat('f_direction',j+4),k,k);    
    set k = (SELECT DATE_ADD(k,INTERVAL 1 SECOND));
    set i = i+1;
    end while;    
    set j = j+1;
    set k = '2011-01-01 00:00:00';    
    END WHILE;
    END$$

------解决方案--------------------
SQL code
DELIMITER $$

DROP PROCEDURE IF EXISTS `data_test`.`gps`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `gps`()
BEGIN
    DECLARE i int DEFAULT 1; 
    DECLARE j int DEFAULT 1; 
    declare k datetime default '2011-01-01 00:00:00';  
    -- j=1这里也初始化一下,当然这个没有必要,因为在最外层,但是写出来就是告诉楼主,
    -- 多层循环中,循环变量在循环之前都需要重新置为初始值。
    set j=1;
    WHILE j<=100 DO
    -- 在每一层开始循环的时候,都需要重新置为初始值,不然i就为86400了,你只执行了j=1这个情况一遍而已。
    set i=1; 
    while i<=86400 do 
                INSERT INTO T_devdata_gps_20110101
                    (f_devid,f_longitude,f_latitude,f_speed,f_direction,f_gpstime,f_instime)   
                VALUES(CONCAT('f_devid',j),concat('f_longitude',j+0.2),
                        concat('f_latitude',j+0.3),concat('f_speed',j+1),
                        concat('f_direction',j+4),k,k);    
    set k = (SELECT DATE_ADD(k,INTERVAL 1 SECOND));
    set i = i+1;
    end while;    
    set j = j+1;
    set k = '2011-01-01 00:00:00';    
    END WHILE;
    END$$