为什么MySQL工作台告诉我分号丢失了?

时间:2017-07-14 11:18:43

标签: mysql mysql-workbench

我正在尝试在MySQL工作台版本6.3上创建存储过程 我得到一个警告,在我的程序代码的第3行中缺少一个分号,但它就在那里。

这是我得到的回应:

  

错误代码:1064。您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在第3行''附近使用的语法

发生了什么事?

CREATE PROCEDURE MigrateDescription()
BEGIN
    DECLARE counter int;
    DECLARE abhid varchar(20);
    DECLARE text_d varchar(50);
    DECLARE text_e varchar(50);
    DECLARE curs CURSOR FOR SELECT `abhaengigkeit`.`AbhId`, `abhaengigkeit`.`Text_D`, `abhaengigkeit`.`Text_E` FROM `p16altdatentest`.`abhaengigkeit`;
    OPEN curs;

    REPEAT
        FETCH curs INTO abhid, text_d, text_e;

        INSERT INTO `paragraph16`.`description`
          (`languageId`,`textKey`,`text`,`isDeleted`,`changedBy`,`changeDate`)
          VALUES
          (1, CONCAT('Dependancy_', REPLACE(abhid, '_', '')), text_d, 0, NULL, CURRENT_TIMESTAMP);
        INSERT INTO `paragraph16`.`description`
          (`languageId`,`textKey`,`text`,`isDeleted`,`changedBy`,`changeDate`)
          VALUES
          (2, CONCAT('Dependancy_', REPLACE(abhid, '_', '')), text_e, 0, NULL, CURRENT_TIMESTAMP);
    END REPEAT
END

1 个答案:

答案 0 :(得分:2)

MySQL Workbench将代码按原样发送到服务器。

MySQL使用;作为语句分隔符。当它在第3行遇到;时,它会认为以CREATE PROCEDURE开头的语句结束,然后是许多其他语句。您发布的代码的前3行绝对不是有效的CREATE PROCEDURE语句。

documentation中所述,为了在BEGIN..END compound statement的主体内部使用;,需要临时将语句分隔符更改为不同的字符或字符序列。< / p>

更改语句分隔符的命令是DELIMITER,后跟要使用的新分隔符。它不需要使用当前分隔符终止;它足以让它独自上线。

将您的代码包含在两个DELIMITER调用中(设置一个新代码,然后将;恢复为分隔符):

DELIMITER //
CREATE PROCEDURE MigrateDescription()
BEGIN
    -- The content of your procedure here, using ; as statement delimiter
END
//             -- This is where the CREATE PROCEDURE statement ends
DELIMITER ;    -- Restore the default delimiter

这是创建包含compound statements的例程,触发器和其他语句的标准MySQL方法。如果例程或触发器主体仅包含一个语句(内部没有;),则不需要它。