代码之家  ›  专栏  ›  技术社区  ›  Andrey

光标未正确运行的MySQL过程

  •  0
  • Andrey  · 技术社区  · 6 年前

    我有更新一些信息的程序。在桌子上,但是。它正在做。有些是错的,而不是错的。更新。我的桌子

    CREATE DEFINER=`andrey.`@`ip` PROCEDURE `sp_visits`()
    BEGIN
    
      DECLARE cursor_VAL VARCHAR(255);
      DECLARE done INT DEFAULT FALSE;
      DECLARE min_date DATETIME DEFAULT FALSE;
      DECLARE max_visits INT DEFAULT FALSE;
      DECLARE cursor_i CURSOR FOR SELECT hash_id FROM .ANDREY;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
      OPEN cursor_i;
      read_loop: LOOP
        FETCH cursor_i INTO  cursor_VAL;
        IF done THEN
          LEAVE read_loop;
        END IF;
    
       select @max_visits := max(visits)
        from ANDREY where hash_id = cursor_VAL ;
    
        select @min_date :=min(date(transaction_ts)) 
        from ANDREY where hash_id = cursor_VAL and visits =@max_visits;
    
       update ANDREYt 
       set visits = @max_visits+1
       where hash_id = cursor_VAL  and date(transaction_ts) between date(@min_date) and DATE(@min_date) + INTERVAL 7 DAY;
    
      END LOOP;
      CLOSE cursor_i;
    END
    

    当我从工作台运行它而不是运行它时,返回一些记录@min_date:=min(日期(事务处理))。 2018—07—20

    我不理解为什么,因为我没有为这个过程指定返回,也不理解为什么它不更新我的表,当我手动运行语句时,不在过程逻辑中,但不在过程中。有什么想法吗?

    with this cursor i am trying to resolve this problem

    1 回复  |  直到 6 年前
        1
  •  1
  •   Barmar    6 年前

    当你做如下事情时:

    select @max_visits := max(visits)
    from ANDREY where hash_id = cursor_VAL ;
    

    在过程中,此查询的结果作为过程的结果返回。你可以用 SELECT INTO :

    SELECT MAX(visits) INTO @max_visits
    FROM ANDREY where hash_id = cursor_VAL ;
    
    SELECT MIN(DATE(transaction_ts) INTO @min_date
    FROM ANDREY where hash_id = cursor_VAL AND visits = @max_visits;