我正在尝试重新创建存储过程(因为我无法编辑正文)。我调用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给了我竖起大拇指。我确信这是一个简单的错过,但对我来说并不是那么明显。
答案 0 :(得分:1)
您缺少存储过程定义之前和之后的delimiter定义:
如果使用mysql客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此必须临时重新定义分隔符以使mysql将整个存储的程序定义传递给服务器。
要重新定义mysql分隔符,请使用delimiter命令。 [...]分隔符更改为//以启用整个分隔符 定义要作为单个语句传递给服务器,然后 恢复到;在调用该过程之前。这使得; 在程序体中使用的分隔符将被传递给 服务器,而不是由mysql本身解释。
由于存储过程定义和正文都没问题,语法chack给你竖起大拇指,但代码无法在你的客户端正常运行。
使用以下框架定义存储过程:
delimiter //
create procedure ...
...
end
//
delimiter ;