目录

背景 (纪要背景)

问题 (要解决的问题)

说明 (问题对应的说明及补充)

解析

问题原因

解决办法


背景

        公司有一个查询系统慢查询较多,在不改变现有数据存储结构的情况下对已有数据进行查询优化.通过索引优化后,主要的问题体现在sql关联之后检索效率就会被拉低,数据也就200多万条.
于此同时如果添加了一些基础的基于索引的条件查询之后慢查询尤为明显.由于数据是定期同步,周期一月,在此期间数据不会发生变化,因此决定通过视图或中间表的方式对数据预处理,为后期的数据检索提供更快的速度.
期间使用MySQL本身提供的定时任务机制,通过存储过程调用时出现了下面的语法问题,场面一度陷入僵持,特此纪要!

问题

        MySQL创建存储过程报错"You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 3".

说明

该问题其实是语法方面的问题,原因在于MySQL对";"的处理差异化导致.解决办法是需要对";"进行转义处理.MySQL也提供了对应的处理方案.

解析

# 出问题的sql(创建一个名为test01的存储过程,其返回结果为当前系统时间)
DELIMITER $$
CREATE PROCEDURE test01()
BEGIN 
# NOW()MySQL当前系统时间获取
	SELECT NOW()$$
END$$

# 调用存储过程
CALL test01();

# 报错如下:

问题原因

        MySQL对";"的处理差异化导致.

解决办法

        对";"进行转义处理.

# 处理后的sql
DELIMITER $$

CREATE PROCEDURE mariadbdata.test01()
BEGIN
	SELECT NOW() AS 'nowDate';
END$$

DELIMITER ;
# 差异说明: 
# 	1. sql内部查询正常使用";",存储过程语法结束时需要对";"进行预转义.
# 	2. 第一次出现delimiter $$是将";"转义为"$$",实现等价于";"的效果. 第二次出现delimiter则是将转义后的";"恢复,否则会面的";"都是转移后的"$$".

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐