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

Ind*_*ity 11 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;
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 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 ;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我不太清楚这到底改变了什么,但这让事情开始工作。但我不得不删除最后一个“DELIMITER”。它给出了“发现无关输入” (2认同)

Ade*_*lin 5

问题是分隔符,你应该更改分隔符。我遇到了同样的问题,更改分隔符解决了这个问题。\n请参阅@Alex 答案。

\n\n

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

\n\n
\n

该示例使用 mysql 客户端分隔符命令将语句分隔符从 ; 更改为\n // 在定义过程时。\n 这会启用 ; 过程主体中使用的分隔符将传递到服务器,而不是由 mysql 本身解释。\n 请参阅第 22.1 节,\xe2\x80\x9c 定义存储程序\xe2\x80\x9d。

\n
\n\n

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

\n\n
DELIMITER // \ncreate procedure some_procedure() \n# Do what you need here\n\nEND // \n\nDELIMITER ; # change the delimiter back again.\n
Run Code Online (Sandbox Code Playgroud)\n