我的mysql的版本是5.6,
以下运行的话正常应该使abc=3,但是却出现错误:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
$$ DELIMITER' at line 4  但是以下两种情况都能运行: SET @abc=if(1>2,3,2); 也可以尝试把set换成select也可以运行: DELIMITER $$
DROP PROCEDURE IF EXISTS TEST
$$ CREATE PROCEDURE `TEST`(IN aaa INT) BEGIN -- SELECT @abc=if(1>2,3,2); END $$
DELIMITER ;
有没有人知道原因?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的问题描述和知识库资料,以下是针对问题的详细分析和解决方案:
错误信息解析
您在运行存储过程时遇到了以下错误:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
$$
DELIMITER' at line 4
这表明在定义存储过程时,SQL语法存在问题。具体来说,DELIMITER
的使用或存储过程的定义可能不符合 MySQL 5.6 的语法规则。
已知正常运行的情况
SET @abc=if(1>2,3,2);
或 SELECT @abc=if(1>2,3,2);
是正常的。SELECT @abc=if(1>2,3,2);
后可以正常运行。这表明问题可能与存储过程中 SELECT @abc=if(1>2,3,2);
的语法有关。
MySQL 5.6 的限制
根据知识库中的信息,MySQL 5.6 在子查询、派生表和视图处理上存在一些限制。此外,MySQL 5.6 对存储过程的语法要求较为严格,尤其是在 DELIMITER
和变量赋值的使用上。
DELIMITER
的使用DELIMITER
用于更改语句结束符,以便在存储过程中使用分号 (;
) 而不被解释为语句结束。DELIMITER $$
和 DELIMITER ;
的使用是正确的,但需要确保它们在客户端工具中被正确解析。某些客户端工具(如 Navicat 或 phpMyAdmin)可能对 DELIMITER
的支持有限。SELECT @abc=if(1>2,3,2);
的语法在 MySQL 5.6 中可能会导致问题。MySQL 5.6 不支持直接在 SELECT
中进行变量赋值。解决方法:将变量赋值改为 SET
语句。例如:
DELIMITER $$
DROP PROCEDURE IF EXISTS TEST $$
CREATE PROCEDURE `TEST`(IN aaa INT)
BEGIN
SET @abc = IF(1 > 2, 3, 2);
END $$
DELIMITER ;
CALL TEST(1);
SELECT @abc;
@abc
的值为 2
,说明存储过程运行正常。SELECT
中直接进行变量赋值,导致存储过程定义失败。SELECT @abc=if(1>2,3,2);
替换为 SET @abc = IF(1 > 2, 3, 2);
。希望以上解答能够帮助您解决问题!如有其他疑问,请随时提问。