一个很奇怪的现象,将 SQL 语句从 Navicat 中导出,在 Navicat 可以正常执行,将 SQL 文件打开后复制语句执行也能正常运行,偏偏用 shell 脚本调用 SQL 文件报错。
反复检查并查看 SQL 报错的地方发现一个规律,报错的位置总是在存储过程语句的地方。
于是乎想到是不是有可能终端把”分号”当成了语句结束符?
顿时想起来,存储过程是不能使用默认的”分号”作为结束符,否则将出现在终端执行时,会出现”断句”错误的问题。
那么问题就找到了,解决办法一并呈上。
eg.
DROP PROCEDURE if EXISTS update_u_func_relation;
-- 定义存储过程
create PROCEDURE update_u_func_relation()
-- 开始
BEGIN
-- ............
END;
修改后:
DROP PROCEDURE if EXISTS update_u_func_relation;
-- 定义使用"//"作为语句结束的标志
DELIMITER // -- 语句开始
-- 定义存储过程
create PROCEDURE update_u_func_relation()
create PROCEDURE update_u_func_relation()
-- 开始
BEGIN
-- ............
END;
//-- 语句结束
DELIMITER ;
DELIMITER //:表示使用 “//“ 作为语句结束的标志,而不是 SQL 默认使用的”分号”。
开始: DELIMITER //
结束: // DELIMITER ;