一个很奇怪的现象,将 SQL 语句从 Navicat 中导出,在 Navicat 可以正常执行,将 SQL 文件打开后复制语句执行也能正常运行,偏偏用 shell 脚本调用 SQL 文件报错。

    反复检查并查看 SQL 报错的地方发现一个规律,报错的位置总是在存储过程语句的地方。

    于是乎想到是不是有可能终端把”分号”当成了语句结束符?

    顿时想起来,存储过程是不能使用默认的”分号”作为结束符,否则将出现在终端执行时,会出现”断句”错误的问题。

    那么问题就找到了,解决办法一并呈上。
    eg.

    1. DROP PROCEDURE if EXISTS update_u_func_relation;
    2. -- 定义存储过程
    3. create PROCEDURE update_u_func_relation()
    4. -- 开始
    5. BEGIN
    6. -- ............
    7. END;

    修改后:

    1. DROP PROCEDURE if EXISTS update_u_func_relation;
    2. -- 定义使用"//"作为语句结束的标志
    3. DELIMITER // -- 语句开始
    4. -- 定义存储过程
    5. create PROCEDURE update_u_func_relation()
    6. create PROCEDURE update_u_func_relation()
    7. -- 开始
    8. BEGIN
    9. -- ............
    10. END;
    11. //-- 语句结束
    12. DELIMITER ;

    DELIMITER //:表示使用 “//“ 作为语句结束的标志,而不是 SQL 默认使用的”分号”。

    开始: DELIMITER //

    结束: // DELIMITER ;