BEGIN之后的MySQL存储过程语法错误

时间:2016-03-22 14:55:07

标签: mysql stored-procedures syntax-error

我正在尝试重新创建存储过程(因为我无法编辑正文)。我调用SHOW CREATE PROCEDURE使用与原始存储过程相同的格式,但是当我尝试重新创建它时,我收到以下错误:

  

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第11行的''附近使用正确的语法

     

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行“DECLARE organization_id BIGINT(20)UNSIGNED”附近使用正确的语法

     

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行'DECLARE lobby_pod_id BIGINT(20)UNSIGNED'附近使用正确的语法

以下是代码:

CREATE DEFINER=`lms`@`10.0.0.%` PROCEDURE `create_organization`(
    IN admin_username VARCHAR(255),
    IN organization_name VARCHAR(100)
)
BEGIN
    DECLARE admin_user_id BIGINT(20) UNSIGNED;
    DECLARE organization_id BIGINT(20) UNSIGNED;
    DECLARE lobby_pod_id BIGINT(20) UNSIGNED;

    SELECT ID, account INTO admin_user_id, organization_id 
    FROM users 
    WHERE username = admin_username;

    INSERT INTO pods (`title`, `description`, `owner`, `scene`)
    VALUES (CONCAT(organization_name, " Village"),
            CONCAT("General meeting space and hub for ", organization_name, " students and teachers."),
            admin_user_id,
            " Village"
    );
END

我粘贴到SQL Fiddle并得到相同的结果,虽然粘贴到MySQL Syntax Check给了我竖起大拇指。我确信这是一个简单的错过,但对我来说并不是那么明显。

1 个答案:

答案 0 :(得分:1)

您缺少存储过程定义之前和之后的delimiter定义:

  

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

     

要重新定义mysql分隔符,请使用delimiter命令。 [...]分隔符更改为//以启用整个分隔符   定义要作为单个语句传递给服务器,然后   恢复到;在调用该过程之前。这使得;   在程序体中使用的分隔符将被传递给   服务器,而不是由mysql本身解释。

由于存储过程定义和正文都没问题,语法chack给你竖起大拇指,但代码无法在你的客户端正常运行。

使用以下框架定义存储过程:

delimiter //
create procedure ...
...
end
//
delimiter ;