我正在尝试在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
答案 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方法。如果例程或触发器主体仅包含一个语句(内部没有;
),则不需要它。