【问题标题】:MySQL mysterious errorMySQL神秘错误
【发布时间】:2014-04-03 10:58:37
【问题描述】:

PHPMyAdmin 一直告诉我,我在第 41 行(倒数第三行)出现错误。我似乎无法找到它,任何帮助/建议将不胜感激。我已经仔细检查了 IF-THEN 语法和游标。

BEGIN
DECLARE `done` BOOLEAN DEFAULT false;
DECLARE `a` TEXT;
DECLARE `cur` CURSOR FOR SELECT `mana_cost` FROM `cards`;   
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done`=TRUE;



OPEN `cur`;

read_loop : LOOP

    FETCH `cur` INTO `a`;
    IF `done`
    THEN LEAVE read_loop;
    END IF;

    IF `a` LIKE '%{B}%'
    THEN            
        UPDATE `cards` SET `color` = 'BLACK '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{G}%'
    THEN            
        UPDATE `cards` SET `color` = 'GREEN '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{U}%'
    THEN            
        UPDATE `cards` SET `color` = 'BLUE '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{W}%'
    THEN            
        UPDATE `cards` SET `color` = 'WHITE '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{R}%'
    THEN            
        UPDATE `cards` SET `color` = 'RED '
        WHERE `mana_cost` = `a`;    

    END IF;

END LOOP;  //line 41
CLOSE `cur`;
END

【问题讨论】:

    标签: mysql sql loops phpmyadmin cursor


    【解决方案1】:

    你的问题很常见,因为MySQL看到“;”就停止创建过程

    您需要使用 DELIMITER 来包装您的程序;)

    分隔符 $ 开始 声明 done 布尔默认值 false; 声明a 文本; 声明 cur 用于选择 mana_cost FROM cards 的光标;
    声明未找到的继续处理程序 done=TRUE;

    打开cur;

    read_loop : 循环

    FETCH `cur` INTO `a`;
    IF `done`
    THEN LEAVE read_loop;
    END IF;
    
    IF `a` LIKE '%{B}%'
    THEN            
        UPDATE `cards` SET `color` = 'BLACK '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{G}%'
    THEN            
        UPDATE `cards` SET `color` = 'GREEN '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{U}%'
    THEN            
        UPDATE `cards` SET `color` = 'BLUE '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{W}%'
    THEN            
        UPDATE `cards` SET `color` = 'WHITE '
        WHERE `mana_cost` = `a`;    
    ELSE IF `a` LIKE '%{R}%'
    THEN            
        UPDATE `cards` SET `color` = 'RED '
        WHERE `mana_cost` = `a`;    
    
    END IF;
    

    结束循环; //第 41 行 关闭cur; 结束 $ *DELIMITER ;*

    您应该尝试类似的方法并查看有关 DELIMITER 和 MySQL 笑话的文档:P

    【讨论】:

    • 但是我用 phpmyadmin 做的,我不需要那里的分隔符(至少我不需要任何其他程序)
    • 当我添加 else-if 时它开始崩溃
    【解决方案2】:
    LEAVE read_loop ;
    END LOOP read_loop ;
    

    添加循环名称和 LEAVE 语句。

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 2017-04-20
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多