为什么MySQL Workbench告诉我需要分号?

为什么MySQL Workbench告诉我需要分号?,mysql,syntax,Mysql,Syntax,此代码已通过多个联机验证测试。我不知道怎么了。在CONCAT函数之后,它说我需要一个分号,尽管那里已经有一个分号了。在end上,当它期望语句结束时,它表示这是无关的输入。有什么好处 create procedure AddColumnUnlessExists( IN dbName tinytext, IN tableName tinytext, IN fieldName tinytext, IN fieldDef text) begin IF NOT EX

此代码已通过多个联机验证测试。我不知道怎么了。在
CONCAT
函数之后,它说我需要一个分号,尽管那里已经有一个分号了。在
end
上,当它期望语句结束时,它表示这是无关的输入。有什么好处

create procedure AddColumnUnlessExists(
    IN dbName tinytext,
    IN tableName tinytext,
    IN fieldName tinytext,
    IN fieldDef text)
begin
    IF NOT EXISTS (
        SELECT * FROM information_schema.COLUMNS
        WHERE column_name=fieldName
        and table_name=tableName
        and table_schema=dbName
        )
    THEN
        set @ddl = CONCAT('ALTER TABLE ', dbName, '.', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef);
        prepare stmt from @ddl;
        execute stmt;
    END IF;
end;

我认为问题在于:您没有使用分隔符

这么说吧:

DELIMITER //
create procedure AddColumnUnlessExists(
    IN dbName tinytext,
    IN tableName tinytext,
    IN fieldName tinytext,
    IN fieldDef text)
begin
    IF NOT EXISTS (
        SELECT * FROM information_schema.COLUMNS
        WHERE column_name=fieldName
        and table_name=tableName
        and table_schema=dbName
        )
    THEN
        set @ddl = CONCAT('ALTER TABLE ', dbName, '.', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef);
        prepare stmt from @ddl;
        execute stmt;
    END IF;
end //
DELIMITER ;
编辑

如果使用mysql客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql 它本身将分号识别为语句分隔符,因此必须 临时重新定义分隔符以使mysql通过整个 将存储程序定义发送到服务器

要重新定义mysql分隔符,请使用delimiter命令。这个 下面的示例显示了如何对dorepeat()过程执行此操作 刚刚展示。分隔符更改为//以启用整个 定义作为单个语句传递给服务器,然后 恢复到;在调用过程之前。这使得; 要传递到的过程体中使用的分隔符 而不是被mysql本身解释


问题是分隔符,您应该更改分隔符。我也遇到了同样的问题,更改分隔符解决了这个问题。 参考@Alex答案

下面是一个简单的解释,引用MySQL文档:

该示例使用mysql客户端分隔符命令更改 来自的语句分隔符;在定义过程时,执行到//的操作。 这使;要传递的过程体中使用的分隔符 而不是由mysql本身进行解释。 请参阅第22.1节“定义存储程序”。


您是否使用phpMyAdmin来设置此存储过程?不,我正在MySQL Workbench中直接在查询窗口中工作。您尝试过我的答案吗?是的,谢谢您的回答。我不太清楚这到底是怎么改变的,但这确实起到了作用。但是我不得不删除最后一个分隔符。它提供了
找到的无关输入
是的,您有理由,应该在那里添加分号。检查我的更新。最后一个分隔符和分号之间的额外空间对我有用。定界符;与命令行中的问题相同,因为
与最终端冲突

DELIMITER // 
create procedure some_procedure() 
# Do what you need here

END // 

DELIMITER ; # change the delimiter back again.