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

时间:2015-05-04 15:31:26

标签: mysql syntax

此代码已通过多项在线验证测试。我不知道出了什么问题。在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;

2 个答案:

答案 0 :(得分:22)

我认为问题是:您没有使用DELIMITER

所以就这样说吧:

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 ;

编辑 https://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html

  

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

     

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

答案 1 :(得分:3)

问题是分隔符,你应该更改分隔符。我有同样的问题,更改分隔符解决了这个问题。 请参阅@Alex Answer。

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

  

该示例使用mysql client delimiter命令更改   声明分隔符;在定义过程时//   这使得;要传递的过程体中使用的分隔符   通过服务器而不是由mysql本身解释。   请参见第22.1节“定义存储的程序”。

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

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

END // 

DELIMITER ; # change the delimiter back again.