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

标签 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

最佳答案

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 ; (带有空格分隔符)只需将分隔符更改回 ;。为什么?其一,程序中的代码以 ; 终止。如果您忘记执行DELIMITER ;,MySQL 将无法在运行时终止过程语句 - 如果您随后执行/调用该过程,您将收到错误。

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

关于mysql - 无法找到mysql存储过程代码中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35224489/

相关文章:

c# - 使用 "Oracle.DataAccess"(带参数)在 C# 中调用 Oracle 存储过程

php - 如何在sql查询中使用Arraylist?

mysql 未找到存储过程

sql - SQL Server 中的优先级队列

php - 如何从本地机器导出存储过程并导入到服务器?

sql - 从存储过程将数据插入临时表

MYSQL:如何将包含日期的 VARCHAR 列转换为 DATE 列?

php - MySQL统计复杂查询结果?

mysql - LOAD DATA LOCAL INFILE 在 Joomla 中无法正常工作。替换而不是追加表中的数据

php - 在自定义帖子类型 WordPress 中插入来自自定义帖子类型的数据