为何手动运行正常的存储过程在Docker初始化MariaDB时触发语法错误?
解决MariaDB Docker初始化存储过程的语法错误
问题核心在于SQL语句的分隔符冲突:Docker启动时,mysql客户端默认用分号(;)作为语句结束标记,但你的存储过程内部包含多个分号,客户端会把存储过程中间的分号当成整个语句的结尾,导致语法解析中断,触发ERROR 1064报错。而IntelliJ这类IDE会自动识别存储过程结构并处理分隔符,所以手动执行正常。
解决办法是临时修改SQL分隔符,避免和存储过程内部的分号冲突:
修改你的03_stored_procedure.sql文件,添加分隔符切换语句:
DELIMITER // CREATE OR REPLACE PROCEDURE filterRentalStationByString ( IN str VARCHAR(255), IN cnt INT ) BEGIN SELECT r.id, r.rental_station_name, r.language_id, r.address, a.street, a.city, a.house_number, a.zip_code FROM rental_stations r INNER JOIN addresses a ON r.address = a.id WHERE MATCH( zip_code, city, street, house_number ) AGAINST ( str ) OR LOWER( CONCAT( rental_station_name, street, city, house_number, zip_code ) ) LIKE LOWER( CONCAT( '%', str, '%' ) ) LIMIT cnt; END // DELIMITER ;
DELIMITER //:告知mysql客户端,暂时将语句结束符改为//,不再使用分号- 存储过程定义完成后,用
END //标记整个存储过程的结束 - 最后用
DELIMITER ;将结束符恢复为默认的分号
修改后重新启动docker-compose,初始化脚本即可正常执行该存储过程。
内容的提问来源于stack exchange,提问作者robertexplodes
相关产品推荐
相关产品推荐

