mysql的存储过程中是否支持嵌套循环:
DELIMITER $$DROP PROCEDURE IF EXISTS `jira20`.`pdm_c_total_number`$$CREATE DEFINER=`jira20`@`%` PROCEDURE `pdm_c_total_number`(p_begin_date DATETIME,p_end_date DATETIME,p_time_interval SMALLINT UNSIGNED)
BEGIN
      DECLARE v_begin DATE ;
      DECLARE v_end DATE ;
      
      SET v_begin = DATE(p_begin_date);
      SET v_end = DATE(p_end_date);         
      
      TRUNCATE TABLE dm_c_total_number;
      
      WHILE v_begin < v_end DO
      WHILE TIME(p_begin_date) < TIME(p_end_date) DO
        INSERT INTO dm_c_total_number (
                                       c_date,
                                       c_begin_time,
                                       c_end_time,
                                       c_total_number
                                      )
        SELECT DATE(v_begin),
               TIME(p_begin_date),
               TIME(DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE)),
               COUNT(*)
          FROM v_jiraissue 
         WHERE DATE(created)=v_begin
           AND TIME(created) BETWEEN TIME(p_begin_date) AND TIME(DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE));
           
        SET p_begin_date = DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE);
      END WHILE;
        SET v_begin = DATE_ADD(DATE(p_begin_date),INTERVAL 1 DAY);
      END WHILE;
    END$$DELIMITER ;我这个存储中貌似只执行了里面的循环,没有执行外面的循环,请教如何修改?

解决方案 »

  1.   

    你的内循环结束后时 SET p_begin_date = DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE);检查一下你的p_begin_date是多少,估计已经超出v_end了。
      

  2.   

     WHILE v_begin < v_end DO
    select v_begin 
    WHILE TIME(p_begin_date) < TIME(p_end_date) DO
    select TIME(p_begin_date)加入SELECT,检查返回信息
      

  3.   

    看我写的小例子drop procedure if exists dowhile;
    CREATE PROCEDURE dowhile()
    BEGIN
      DECLARE v1 INT DEFAULT 5;
      
    WHILE v1 > 0 DO
        begin
            DECLARE V2 INT DEFAULT 10;
            WHILE V2>0 DO
              SELECT CONCAT(V1,V2);
              SET V2=V2-1;
            END WHILE ;
        end;
        SET v1 = v1 - 1;
      END WHILE ;
    END;CALL DOWHILE();
      

  4.   

    注意你的内循环的条件定义的位置。应该在外循环里面,这样每次外循环后,变量都会初始化。可以用TOAD FOR MYSQL进行单步调试。DECLARE V2 INT DEFAULT 10;注意这个的位置,如果和V1定义在一起的话,那就只会循环一次。
      

  5.   

    别说找不到原因。你把内循环包含在一个BEGIN END 块中去,然后把对时间循环的定义放到这个块内,肯定就OK。。你看看6楼是怎么写的,参考参考。
      

  6.   

    我按照你说的加入了beginend块,但是结果一样。
    DELIMITER $$DROP PROCEDURE IF EXISTS `jira20`.`pdm_c_total_number`$$CREATE DEFINER=`jira20`@`%` PROCEDURE `pdm_c_total_number`(p_begin_date DATETIME,p_end_date DATETIME,p_time_interval SMALLINT UNSIGNED)
    BEGIN
          
          DECLARE v_begin DATE ;
          DECLARE v_end DATE ;
          
          SET v_begin = DATE(p_begin_date);
          SET v_end = DATE(p_end_date);    
             
          TRUNCATE TABLE dm_c_total_number;
          WHILE v_begin < v_end DO  
                SELECT v_begin,v_end;
            BEGIN
          WHILE TIME(p_begin_date) < TIME(p_end_date) DO
            INSERT INTO dm_c_total_number (
                                           c_date,
                                           c_begin_time,
                                           c_end_time,
                                           c_total_number
                                          )
            SELECT v_begin,
                   TIME(p_begin_date),
                   TIME(DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE)),
                   COUNT(*)
              FROM v_jiraissue 
             WHERE DATE(created) = v_begin
               AND TIME(created) BETWEEN TIME(p_begin_date) AND TIME(DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE));
               
            SET p_begin_date = DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE);
          END WHILE;
      END;
      SELECT v_begin,v_end;
            SET v_begin = DATE_ADD(v_begin,INTERVAL 1 DAY);
          END WHILE;
        END$$DELIMITER ;
    而且我select出来的v_begin确实是小于v_end。
      

  7.   

    提供你所以的测试用环境设置。
    create procedure ..
    cretea table ..
    insert into ..等语句,这样别人可以直接在本机搭建相同的环境进行测试分析。
      

  8.   

    注意你的TIME(p_begin_date)、 TIME(p_end_date)在第2个循环中值已经修改
      

  9.   

    CREATE TABLE `v_jiraissue` (
      `issueid` int(11) default NULL,
      `created` datetime default NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert  into `v_jiraissue`(`issueid`,`created`) values (39735,'2010-09-10 10:31:23'),(39736,'2010-09-10 10:32:54'),(39737,'2010-09-10 10:34:45'),(39738,'2010-09-10 10:46:00'),(39739,'2010-09-10 10:58:23'),(39740,'2010-09-10 11:10:08'),(39741,'2010-09-10 11:15:40'),(39742,'2010-09-10 11:18:31'),(39743,'2010-09-10 14:19:01'),(39744,'2010-09-10 14:36:16'),(39745,'2010-09-10 15:09:36'),(39746,'2010-09-10 15:18:20'),(39747,'2010-09-10 15:23:07'),(39748,'2010-09-10 15:27:03'),(39749,'2010-09-10 15:29:29'),(39750,'2010-09-10 15:33:49'),(39751,'2010-09-10 15:37:20'),(39752,'2010-09-10 15:41:54'),(39753,'2010-09-10 15:49:02'),(39754,'2010-09-10 15:58:40'),(39755,'2010-09-10 15:59:10'),(39756,'2010-09-10 15:59:19'),(39757,'2010-09-10 16:01:02'),(39758,'2010-09-10 16:02:05'),(39759,'2010-09-10 16:09:44'),(39760,'2010-09-10 16:13:51'),(39761,'2010-09-10 16:25:04'),(39762,'2010-09-10 16:37:28'),(39763,'2010-09-10 17:00:31'),(39764,'2010-09-10 17:04:06'),(39765,'2010-09-10 17:12:34'),(39766,'2010-09-10 17:22:39'),(39767,'2010-09-10 17:27:58'),(39768,'2010-09-10 17:35:10'),(39769,'2010-09-10 17:36:10'),(39770,'2010-09-10 17:39:03'),(39771,'2010-09-10 17:39:23'),(39772,'2010-09-10 17:44:38'),(39773,'2010-09-10 17:47:53'),(39774,'2010-09-10 17:51:01'),(39775,'2010-09-10 17:58:28'),(39776,'2010-09-10 18:05:57'),(39777,'2010-09-10 18:23:15'),(39778,'2010-09-10 18:49:04'),(39779,'2010-09-10 21:29:32'),(39780,'2010-09-10 21:31:19'),(39781,'2010-09-10 21:32:05'),(39782,'2010-09-10 21:32:59'),(39783,'2010-09-10 21:33:57'),(39785,'2010-09-10 21:40:55'),(39786,'2010-09-11 01:47:17'),(39787,'2010-09-11 01:50:19'),(39788,'2010-09-11 01:54:26'),(39789,'2010-09-11 01:57:58'),(39790,'2010-09-11 02:00:34'),(39791,'2010-09-11 02:04:02'),(39792,'2010-09-11 02:07:47'),(39793,'2010-09-11 02:17:00'),(39794,'2010-09-11 02:37:54'),(39795,'2010-09-11 18:54:14'),(39796,'2010-09-13 09:13:03'),(39797,'2010-09-13 10:15:34'),(39798,'2010-09-13 10:27:18'),(39799,'2010-09-13 10:31:38'),(39800,'2010-09-13 11:02:11'),(39801,'2010-09-13 11:13:02'),(39802,'2010-09-13 11:13:29'),(39803,'2010-09-13 11:13:34'),(39804,'2010-09-13 11:34:07'),(39805,'2010-09-13 13:26:12'),(39806,'2010-09-13 13:37:35'),(39807,'2010-09-13 13:40:06'),(39808,'2010-09-13 13:43:44'),(39809,'2010-09-13 13:44:52'),(39810,'2010-09-13 13:46:30'),(39811,'2010-09-13 14:03:04'),(39812,'2010-09-13 14:11:04'),(39813,'2010-09-13 14:14:43'),(39814,'2010-09-13 14:20:28'),(39815,'2010-09-13 14:20:32'),(39816,'2010-09-13 14:23:39'),(39817,'2010-09-13 14:24:46'),(39818,'2010-09-13 14:28:17'),(39819,'2010-09-13 14:47:21'),(39820,'2010-09-13 14:58:14'),(39821,'2010-09-13 14:59:15'),(39822,'2010-09-13 15:03:15'),(39823,'2010-09-13 15:06:03'),(39824,'2010-09-13 15:11:53'),(39825,'2010-09-13 15:18:54'),(39826,'2010-09-13 15:56:48'),(39827,'2010-09-13 16:36:42'),(39828,'2010-09-13 16:46:40'),(39829,'2010-09-13 17:12:14'),(39831,'2010-09-13 17:24:11'),(39832,'2010-09-13 18:52:28'),(39833,'2010-09-14 09:37:27'),(39834,'2010-09-14 09:47:59'),(39835,'2010-09-14 10:07:39'),(39836,'2010-09-14 10:24:17'),(39837,'2010-09-14 10:33:01'),(39838,'2010-09-14 10:42:48'),(39839,'2010-09-14 10:43:05'),(39840,'2010-09-14 10:49:43'),(39841,'2010-09-14 10:50:54'),(39842,'2010-09-14 10:52:02'),(39843,'2010-09-14 10:52:34'),(39844,'2010-09-14 10:53:02'),(39845,'2010-09-14 10:54:35'),(39846,'2010-09-14 11:12:30'),(39847,'2010-09-14 11:17:26'),(39848,'2010-09-14 11:24:23'),(39849,'2010-09-14 11:29:01'),(39850,'2010-09-14 11:31:07'),(39851,'2010-09-14 11:34:59'),(39852,'2010-09-14 11:37:16'),(39853,'2010-09-14 11:47:53'),(39854,'2010-09-14 13:38:08'),(39855,'2010-09-14 13:42:26'),(39856,'2010-09-14 13:58:16'),(39857,'2010-09-14 14:01:39'),(39858,'2010-09-14 14:08:47'),(39859,'2010-09-14 14:27:47'),(39860,'2010-09-14 14:55:06'),(39861,'2010-09-14 14:56:39'),(39862,'2010-09-14 15:02:23'),(39863,'2010-09-14 15:13:24'),(39864,'2010-09-14 15:31:32'),(39865,'2010-09-14 15:41:03'),(39866,'2010-09-14 15:48:40'),(39867,'2010-09-14 16:06:52'),(39868,'2010-09-14 16:09:42'),(39869,'2010-09-14 16:12:51'),(39870,'2010-09-14 16:14:40'),(39871,'2010-09-14 16:17:23'),(39872,'2010-09-14 16:25:03'),(39873,'2010-09-14 16:42:10'),(39874,'2010-09-14 16:51:41'),(39875,'2010-09-14 17:08:17'),(39876,'2010-09-14 17:24:40'),(39877,'2010-09-15 10:28:07'),(39878,'2010-09-15 10:30:31'),(39879,'2010-09-15 10:30:55'),(39880,'2010-09-15 10:31:44'),(39881,'2010-09-15 10:34:14'),(39882,'2010-09-15 10:36:53'),(39883,'2010-09-15 11:03:16'),(39884,'2010-09-15 11:06:37'),(39885,'2010-09-15 11:13:54'),(39886,'2010-09-15 11:18:27'),(39887,'2010-09-15 11:19:48'),(39888,'2010-09-15 13:40:10'),(39889,'2010-09-15 14:09:16'),(39890,'2010-09-15 14:52:23'),(39891,'2010-09-15 14:55:59'),(39892,'2010-09-15 15:07:58'),(39893,'2010-09-15 15:26:02'),(39894,'2010-09-15 15:33:39'),(39895,'2010-09-15 15:36:45'),(39896,'2010-09-15 15:42:38'),(39897,'2010-09-15 15:53:12'),(39898,'2010-09-15 16:22:35'),(39899,'2010-09-15 17:25:32'),(39900,'2010-09-15 17:26:08'),(39901,'2010-09-15 17:32:29'),(39902,'2010-09-15 17:37:16'),(39910,'2010-09-16 09:58:22'),(39911,'2010-09-16 10:44:18'),(39912,'2010-09-16 10:47:42'),(39913,'2010-09-16 10:59:55'),(39914,'2010-09-16 11:04:54'),(39915,'2010-09-16 11:06:54'),(39916,'2010-09-16 11:08:10'),(39917,'2010-09-16 11:19:41'),(39918,'2010-09-16 11:27:31'),(39919,'2010-09-16 11:30:39'),(39920,'2010-09-16 11:59:32'),(39921,'2010-09-16 14:28:05'),(39922,'2010-09-16 14:42:06'),(39923,'2010-09-16 14:44:27'),(39924,'2010-09-16 14:48:43'),(39925,'2010-09-16 14:50:08'),(39926,'2010-09-16 14:50:23'),(39927,'2010-09-16 14:51:41'),(39928,'2010-09-16 15:50:41'),(39929,'2010-09-16 16:26:28'),(39930,'2010-09-16 17:23:22'),(39931,'2010-09-16 18:11:54'),(39932,'2010-09-17 10:20:28'),(39933,'2010-09-17 10:21:33'),(39934,'2010-09-17 10:23:00'),(39935,'2010-09-17 10:26:08'),(39936,'2010-09-17 10:33:58'),(39937,'2010-09-17 10:35:57'),(39938,'2010-09-17 10:37:14'),(39939,'2010-09-17 10:53:26'),(39940,'2010-09-17 10:53:49'),(39941,'2010-09-17 10:58:06'),(39942,'2010-09-17 11:54:59'),(39943,'2010-09-17 13:35:18'),(39944,'2010-09-17 13:59:04'),(39945,'2010-09-17 14:00:20'),(39946,'2010-09-17 14:17:39'),(39947,'2010-09-17 14:19:21'),(39948,'2010-09-17 14:20:52'),(39949,'2010-09-17 14:21:56'),(39950,'2010-09-17 15:04:11'),(39951,'2010-09-17 15:17:07'),(39952,'2010-09-17 15:38:36'),(39953,'2010-09-17 15:42:29'),(39954,'2010-09-17 15:49:42'),(39955,'2010-09-17 15:53:09'),(39956,'2010-09-17 15:56:47'),(39957,'2010-09-17 16:08:22'),(39958,'2010-09-17 16:11:01'),(39959,'2010-09-17 16:16:29'),(39960,'2010-09-17 16:50:14'),(39962,'2010-09-17 17:37:19'),(39963,'2010-09-19 10:01:00'),(39964,'2010-09-19 10:09:30'),(39965,'2010-09-19 10:11:05'),(39966,'2010-09-19 10:24:20'),(39967,'2010-09-19 10:38:04'),(39968,'2010-09-19 10:42:29'),(39969,'2010-09-19 10:48:13'),(39970,'2010-09-19 11:06:02'),(39971,'2010-09-19 13:37:32'),(39972,'2010-09-19 13:43:12'),(39973,'2010-09-19 13:45:22'),(39974,'2010-09-19 13:47:16'),(39975,'2010-09-19 13:48:34'),(39976,'2010-09-19 13:49:54'),(39977,'2010-09-19 13:52:33'),(39978,'2010-09-19 14:03:31'),(39979,'2010-09-19 14:07:08'),(39980,'2010-09-19 14:08:32'),(39981,'2010-09-19 14:09:48'),(39982,'2010-09-19 14:11:31'),(39983,'2010-09-19 14:12:42'),(39984,'2010-09-20 10:06:58'),(39985,'2010-09-20 11:07:24'),(39986,'2010-09-20 11:30:29'),(39987,'2010-09-20 11:50:15'),(39988,'2010-09-20 11:52:14'),(39989,'2010-09-20 15:09:07'),(39990,'2010-09-20 16:02:57'),(39991,'2010-09-20 16:09:20'),(39992,'2010-09-20 16:24:37'),(39993,'2010-09-20 16:33:26'),(39994,'2010-09-20 16:37:59'),(39995,'2010-09-20 16:56:08'),(39996,'2010-09-20 17:27:13'),(39997,'2010-09-20 17:38:49'),(39998,'2010-09-20 17:41:34'),(39999,'2010-09-20 17:52:30'),(40000,'2010-09-20 17:56:49'),(40001,'2010-09-20 17:58:01'),(40002,'2010-09-20 18:08:45'),(40003,'2010-09-20 18:25:04');CREATE TABLE `dm_c_total_number` (                     
                         `dm_c_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,  
                         `c_date` DATE DEFAULT NULL,                          
                         `c_begin_time` TIME DEFAULT NULL,                    
                         `c_end_time` TIME DEFAULT NULL,                      
                         `c_total_number` INT(11) DEFAULT NULL,               
                         PRIMARY KEY  (`dm_c_id`)                             
                       ) ENGINE=INNODB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8  谢谢,以上是表结构和数据。
      

  10.   

    SET p_begin_date = DATE_ADD(p_begin_date,INTERVAL p_time_interval MINUTE);
    检查第2次的值
      

  11.   

    时间一样了  但是日期却是不一样的  。
    p_begin_date p_end_date
    2010-09-01 17:00:00 2010-09-02 17:00:00
      

  12.   

    哦  貌似 begin和end都成了一样了。。
      

  13.   

    简化了一下,
    DELIMITER $$USE `ee`$$DROP PROCEDURE IF EXISTS `pdm_c_total_number`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `pdm_c_total_number`(p_begin_date DATETIME,p_end_date DATETIME,p_time_interval SMALLINT UNSIGNED)
    BEGIN
        
      DECLARE v_begin DATE ;
      DECLARE v_end DATE ;
      DECLARE p_begin_datea DATETIME;
      DECLARE p_end_datea DATETIME;
        
      SET v_begin = DATE(p_begin_date);
      SET v_end = DATE(p_end_date);   
      SET p_begin_datea=(p_begin_date);
      SET p_end_datea=(p_end_date);
      WHILE v_begin < v_end DO   
      SELECT v_begin,v_end;
      
    WHILE TIME(p_begin_datea) < TIME(p_end_datea) DO
    SELECT p_begin_datea,p_end_datea,'ab';SET p_begin_datea = DATE_ADD(p_begin_datea,INTERVAL p_time_interval MINUTE);
    SELECT TIME(p_begin_datea),TIME(p_end_datea),'cd';
    END WHILE;
      SET v_begin = DATE_ADD(v_begin,INTERVAL 1 DAY);
       SET p_begin_datea=CAST(CONCAT(DATE(V_BEGIN),' ',TIME(p_begin_date)) AS DATETIME);
      SET p_end_datea=(p_end_date);
      END WHILE;
      END$$DELIMITER ;自行修改
      

  14.   

    重新仔细检查了一遍
    DELIMITER $$USE `jira20`$$DROP PROCEDURE IF EXISTS `pdm_c_total_number`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `pdm_c_total_number`(p_begin_date DATETIME,p_end_date DATETIME,p_time_interval SMALLINT UNSIGNED)
    BEGIN
    DECLARE v_begin_date DATE;
    DECLARE v_end_date DATE;
    DECLARE v_begin_time DATETIME;
    DECLARE v_end_time DATETIME;

    SET v_begin_date = DATE(p_begin_date);
    SET v_end_date = DATE(p_end_date);
    SET v_begin_time = p_begin_date;
    SET v_end_time = p_end_date;

    TRUNCATE TABLE dm_c_total_number;
    WHILE v_begin_date < v_end_date DO
    WHILE TIME(v_begin_time) < TIME(v_end_time) DO
    INSERT INTO dm_c_total_number (
    c_date,
    c_begin_time,
    c_end_time,
    c_total_number
    )
    SELECT v_begin_date,
    TIME(v_begin_time),
    TIME(DATE_ADD(v_begin_time,INTERVAL p_time_interval MINUTE)),
    COUNT(*)
    FROM v_jiraissue
    WHERE DATE(created) = v_begin_date是这里的值没有变化导致的问题 AND TIME(created) BETWEEN TIME(v_begin_time) AND DATE_ADD(v_begin_time,INTERVAL p_time_interval MINUTE);

    SELECT v_begin_date,v_end_date;
    SET v_begin_time = DATE_ADD(v_begin_time,INTERVAL p_time_interval MINUTE);
    END WHILE;
    SELECT v_begin_date,v_end_date;
    SET v_begin_date = DATE_ADD(v_begin_date,INTERVAL 1 DAY);
    SET v_end_date = DATE(p_end_date);
    END WHILE;

    END$$DELIMITER ;
      

  15.   

    SET v_begin_time = DATE_ADD(v_begin_time,INTERVAL p_time_interval MINUTE);
    你的v_begin_time在第2次循环之前没有重新赋值,不可能循环
      

  16.   

    有什么办法能够让v_begin_time跟着改变,我使用if语句貌似也不可以。
    WHERE DATE(created) = if(time(p_begin_date) = time(p_end_date),(v_begin_date,interval 1 day),v_begin_date)