2016-02-05 32 views
0

我已创建了一个存储过程中,每一件事情是根据 代码无法找到代码中的错误对于MySQL的存储过程

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

+0

你是否在新的空标签中创建这个过程?那就不要。要创建一个过程,请右键单击存储过程>创建存储过程>然后将代码粘贴到那里,而不用'DEFINER ='root' @'localhost'。 –

+0

对不起,我没有得到你..这个截图是查询被解雇使用SQLyog –

+0

,但我创造了另一个过程使用相同的事情,其中​​IF条件不存在,它正在与 –

回答

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;,而不是从$$改变终止回到;这也是语法不正确。 DELIMITER ;(带空格分隔符)只是将分隔符更改回;。为什么?首先,您的程序中的代码将由;终止。如果您忘记执行,MySQL将无法在运行时终止过程语句DELIMITER ; - 如果您之后执行/调用过程,则会出错。

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

+0

它的工作原理..想知道为什么这个半冒号间距很重要? –

+0

@ShubhamNigam,我在上面添加了“解释”。希望它能帮助你理解这件事。 – rma

+0

雅感谢您的解释是相当有益的..继续帮助他人.. :) –

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 $$ 
+0

所以这是什么问题与DEFINER = 'root' @'localhost' –