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 ;我这个存储中貌似只执行了里面的循环,没有执行外面的循环,请教如何修改?
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 ;我这个存储中貌似只执行了里面的循环,没有执行外面的循环,请教如何修改?
select v_begin
WHILE TIME(p_begin_date) < TIME(p_end_date) DO
select TIME(p_begin_date)加入SELECT,检查返回信息
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();
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。
create procedure ..
cretea table ..
insert into ..等语句,这样别人可以直接在本机搭建相同的环境进行测试分析。
`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 谢谢,以上是表结构和数据。
检查第2次的值
p_begin_date p_end_date
2010-09-01 17:00:00 2010-09-02 17:00:00
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 ;自行修改
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 ;
你的v_begin_time在第2次循环之前没有重新赋值,不可能循环
WHERE DATE(created) = if(time(p_begin_date) = time(p_end_date),(v_begin_date,interval 1 day),v_begin_date)