无法在mysql存储过程的代码中找到错误

时间:2016-02-05 12:38:43

标签: mysql stored-procedures

我创建了一个存储过程,其中每个东西都是根据的 代码

DELIMITER $$;
CREATE DEFINER=`root`@`localhost` PROCEDURE `mark_all_read`(IN user_name VARCHAR(50),IN group_name VARCHAR(50),IN choice CHAR(10),IN nid CHAR(30))
BEGIN
IF choice = 'all' THEN
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name;
ELSE
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name AND noticationId = nid;
END IF; 
END $$
DELIMITER;

错误: enter image description here

2 个答案:

答案 0 :(得分:1)

1。)检查第一个语句DELIMITER $$;,它应该[只]是DELIMITER $$,没有分号

2。)检查最后一个语句DELIMITER;,它应该是DELIMITER ;,其间有空格

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `mark_all_read`(IN user_name VARCHAR(50),IN group_name VARCHAR(50),IN choice CHAR(10),IN nid CHAR(30))
BEGIN
IF choice = 'all' THEN
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name;
ELSE
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name AND noticationId = nid;
END IF; 
END$$
DELIMITER ;

说明:

1。)DELIMITER $$;表示您正在将默认分隔符从;修改为$$;。但是,在代码结束时,CREATE PROCEDURE语句被$$(而不是$$;)终止,MySQL无法识别。为了简化解决方案,我使用$$并使用CREATE PROCEDURE结束$$。您需要修改分隔符,因为在您的过程中存在分号;分隔符,否则MySQL将不知道哪个分隔符终止CREATE PROCEDURE语句。

2。)DELIMITER;(没有空格分隔符)表示您正在终止DELIMITER语句,就像SELECT * FROM TABLE;一样,并且不会将终结符从$$更改回{{1它在语法上也是不正确的。 ;(带空格分隔符)只需将分隔符更改回DELIMITER ;。为什么?例如,您的程序中的代码由;终止。如果忘记执行;,MySQL将无法在运行时终止过程语句 - 如果之后执行/调用该过程,则会出现错误。

您可以进一步阅读有关此事的MySQL文档。希望解释有所帮助。

答案 1 :(得分:0)

其工作

CREATE PROCEDURE `mark_all_read`(IN user_name VARCHAR(50),IN group_name VARCHAR(50),IN choice CHAR(10),IN nid CHAR(30))
BEGIN
IF choice = 'all' THEN
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name;
ELSE
 UPDATE notifications SET STATUS = 'read' WHERE USER = user_name AND groupId = group_name AND noticationId = nid;
END IF; 
END $$