首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql :在while循环后声明游标

mysql :在while循环后声明游标
EN

Stack Overflow用户
提问于 2012-08-02 20:22:21
回答 1查看 5.5K关注 0票数 4

我已经创建了一个存储过程。在执行完一些操作之后,我想声明游标并从游标中获取数据。但是,它给出了语法错误。下面是我的存储过程

代码语言:javascript
复制
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 ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-24 22:48:59

在MySQL中有一条(相当奇怪的)规则,即DECLARE语句应该紧跟在BEGIN之后,在任何SETINSERT等语句之前。请参阅本文http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html

因此,您的脚本应该如下所示:

代码语言:javascript
复制
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 ;

希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11777326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档