2012-08-02 90 views
3

我創建了一個存儲過程。在執行一些操作後,我想聲明遊標並從該遊標獲取數據。但是,它給出了語法錯誤。下面是我的存儲過程mysql:while循環後聲明遊標

DELIMITER $$ 

USE `adserver`$$ 

DROP PROCEDURE IF EXISTS `getDaypartTimeDetail`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `getDaypartTimeDetail`(currentDate DATE,noOfdays INT,cityId BIGINT) 
BEGIN 
    DECLARE TotalFiles, TotalDuration BIGINT; 
    DECLARE i INT; 
    DECLARE da DATE; 
    DECLARE dateCnt INT; 


    SET dateCnt = 0; 
    SET TotalFiles = 0; 
    SET TotalDuration = 0; 
    DROP TEMPORARY TABLE IF EXISTS tmp_date; 
    DROP TEMPORARY TABLE IF EXISTS temp_data; 

    CREATE TEMPORARY TABLE tmp_date(dday DATE); 
    CREATE TEMPORARY TABLE temp_data(dday DATE,daypartId INT,totalFile BIGINT,totalDur BIGINT); 

    WHILE(dateCnt < noOfdays) DO 
     SET i = 1; 
     INSERT INTO tmp_date(dday) VALUES (DATE_ADD(currentDate, INTERVAL dateCnt DAY)); 
    SET dateCnt = dateCnt + 1; 
    END WHILE; 

    DECLARE exit_flag INT DEFAULT 0; ****<-- Gives error**** 
    DECLARE dday DATE; 
    DECLARE dId BIGINT; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_flag = 1; 
    DECLARE cur CURSOR FOR SELECT dday, id FROM tmp_date, daypart; 

    OPEN cur; 
     all_details_id:LOOP 
      FETCH cur INTO dday,dId; 
      IF record_not_found THEN 
       LEAVE all_details_id; 
      END IF; 
     INSERT INTO temp_data(dday,daypartId) VALUES (dday,dId); 
     END LOOP all_details_id; 
    CLOSE cur; 

    SELECT * FROM temp_data; 

END$$ 

DELIMITER ; 
+0

什麼錯誤? – Madhivanan 2012-08-02 12:29:06

+0

@Madhivanan語法錯誤 – vishal 2012-08-02 12:35:00

+0

我正在使用sqlyog – vishal 2012-08-02 12:35:24

回答

2

有在MySQL(很奇怪)規則,它說,DECLARE報表應BEGIN後馬上去之前任何SETINSERT等語句。請參考本文http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html

所以,你的腳本看起來應該像下面這樣:

DELIMITER $$ 

USE `adserver`$$ 

DROP PROCEDURE IF EXISTS `getDaypartTimeDetail`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `getDaypartTimeDetail`(currentDate DATE,noOfdays INT,cityId BIGINT) 
BEGIN 
    DECLARE TotalFiles, TotalDuration BIGINT; 
    DECLARE i INT; 
    DECLARE da DATE; 
    DECLARE dateCnt INT; 

    DECLARE exit_flag INT DEFAULT 0; ****<-- Gives error**** 
    DECLARE dday DATE; 
    DECLARE dId BIGINT; 
    DECLARE cur CURSOR FOR SELECT dday, id FROM tmp_date, daypart; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_flag = 1; 

    SET dateCnt = 0; 
    SET TotalFiles = 0; 
    SET TotalDuration = 0; 
    DROP TEMPORARY TABLE IF EXISTS tmp_date; 
    DROP TEMPORARY TABLE IF EXISTS temp_data; 

    CREATE TEMPORARY TABLE tmp_date(dday DATE); 
    CREATE TEMPORARY TABLE temp_data(dday DATE,daypartId INT,totalFile BIGINT,totalDur BIGINT); 

    WHILE(dateCnt < noOfdays) DO 
     SET i = 1; 
     INSERT INTO tmp_date(dday) VALUES (DATE_ADD(currentDate, INTERVAL dateCnt DAY)); 
    SET dateCnt = dateCnt + 1; 
    END WHILE; 

    OPEN cur; 
     all_details_id:LOOP 
      FETCH cur INTO dday,dId; 
      IF record_not_found THEN 
       LEAVE all_details_id; 
      END IF; 
     INSERT INTO temp_data(dday,daypartId) VALUES (dday,dId); 
     END LOOP all_details_id; 
    CLOSE cur; 

    SELECT * FROM temp_data; 

END$$ 

DELIMITER ; 

希望這有助於...