【问题标题】:MySQL cursor is fetching the only first record multiple timesMySQL游标多次获取唯一的第一条记录
【发布时间】:2014-02-21 21:19:05
【问题描述】:

我的存储过程是这样的:

CREATE PROCEDURE `kiosk_pro`.`setTimeAdjustForNext`(tokenno int,cdate date)
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN

        declare lo_SNO int;

        declare lo_TokenNo int;


        DECLARE done INT DEFAULT FALSE ;

       Declare mycur Cursor for( select  SNO  from kiosk_token_generation  where TokenDate=cdate and  TokenNo >= tokenno order by TokenNo );
              DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
       open mycur;

        time_loop :LOOP 

              FETCH mycur into lo_SNO;

             if done then 
                 close mycur;  
                  leave time_loop;
             end if;

            select lo_SNO ;

           end loop time_loop;


    END$$

实际上我的表在 SNO 列中有 3 条记录 1,2,3 和 1,2,3 在 TokenNo 列,我通过传递date ='2014-02-22'tokenno=1 调用上面的存储过程,但是它返回了3 次1 值。

我在哪里做错了?

【问题讨论】:

    标签: mysql stored-procedures cursor


    【解决方案1】:

    你的 SP 工作正常

    也许你在不同的数据库中有另一个 SP

    create table kiosk_token_generation (SNO  int, TokenNo int, TokenDate datetime);
    INSERT INTO kiosk_token_generation (SNO, TokenNo, TokenDate) VALUES (1,1,'2014-02-22');
    INSERT INTO kiosk_token_generation (SNO, TokenNo, TokenDate) VALUES (2,2,'2014-02-22');
    INSERT INTO kiosk_token_generation (SNO, TokenNo, TokenDate) VALUES (3,3,'2014-02-22');
    
    
    
    DELIMITER $$
    CREATE PROCEDURE setTimeAdjustForNext(tokenno int,cdate date)
        BEGIN
           declare lo_SNO int;
           declare lo_TokenNo int;
           DECLARE done INT DEFAULT FALSE;
           Declare mycur Cursor for( select  SNO  from kiosk_token_generation  where TokenDate=cdate and  TokenNo >= tokenno order by TokenNo );
           DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
           open mycur;
           time_loop :LOOP
                  FETCH mycur into lo_SNO;
                 if done then
                     close mycur;
                     leave time_loop;
                 end if;
                select lo_SNO ;
               end loop time_loop;
        END$$
    DELIMITER ;
    
    
    
    
    
    
    select  SNO  from kiosk_token_generation  where TokenDate='2014-02-22' and  TokenNo >= 1 order by TokenNo
    
    CALL setTimeAdjustForNext (1, '2014-02-22');
    

    【讨论】:

    • 如果我们使用 TokenNo 而不是光标中的 SNO,那么它就不能正常工作
    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多