为什么该存储过程在MySQL中无法运行?报1064语法错误
错误根因
这个1064语法错误是自定义分隔符书写格式不规范导致的:
你虽然通过delimiter $$把客户端临时语句结束符改成了$$,避免和存储过程内部语句的;冲突,但代码里把存储过程结束关键字END和分隔符$$直接连写成了end$$。绝大多数MySQL客户端(官方命令行、Navicat、DBeaver等各版本)解析时,会把连写的end$$识别成一个普通标识符,不会把后面的$$判定为存储过程的结束标记。客户端解析到第三行INSERT语句末尾的;时,就认为当前语句已经结束,找不到和BEGIN匹配的块结束标识,最终抛出指向空字符串的语法报错。
修复方案
只需要在END关键字和自定义分隔符$$之间加一个半角空格,规范代码格式即可。修正后可正常执行的完整代码如下:
DROP PROCEDURE IF EXISTS insercion_anime; DELIMITER $$ CREATE PROCEDURE insercion_anime ( IN nombre_anime VARCHAR(200), IN a_english_name VARCHAR(200) ) BEGIN INSERT INTO anime (name, english_name) VALUES (nombre_anime, a_english_name); END $$ DELIMITER ;
验证方式
代码执行无报错后,可以运行如下调用语句测试功能是否正常:
CALL insercion_anime('间谍过家家', 'SPY×FAMILY');
执行后查询anime表,能看到对应插入的数据就说明存储过程生效正常。
注意:执行创建语句时不要选中末尾
DELIMITER ;之后的空白不可见字符,部分客户端会把这类不可见字符识别为非法语法触发报错。
内容的提问来源于stack exchange,提问作者Francesco Forace
相关产品推荐
相关产品推荐

