此代码已通过多个在线验证测试。我不知道出了什么问题。在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
。
所以就这样说吧:
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本身解释。
问题是分隔符,你应该更改分隔符。我有同样的问题,更改分隔符解决了问题。请参阅@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.