问题根源
sqlyog的语句分隔逻辑:
sqlyog默认会根据分号(
;
)和换行自动分隔sql语句当代码有缩进时,sqlyog可能错误地将缩进后的内容识别为新的sql语句
delimiter的敏感性:
delimiter //
命令必须独立一行且无前导空格任何缩进都会导致sqlyog将其视为普通文本而非指令
存储过程体内的语句:
过程体内的缩进不会影响执行(因为是作为整体解析)
但过程体外的命令(如delimiter)必须无缩进
正确写法示例
-- 必须顶格写(无缩进) delimiter // create procedure grant_role_to_all_users() begin -- 这里面的缩进不会影响执行 declare finished integer default 0; declare user_host varchar(255); declare user_cursor cursor for select concat('`',user,'`@`',host,'`') from mysql.user where user not in ('root','mysql.sys','mysql.session','mysql.infoschema'); declare continue handler for not found set finished = 1; open user_cursor; get_user: loop fetch user_cursor into user_host; if finished = 1 then leave get_user; end if; set @grant_sql = concat('grant "public_role" to ', user_host); prepare stmt from @grant_sql; execute stmt; deallocate prepare stmt; set @default_sql = concat('set default role "public_role" for ', user_host); prepare stmt from @default_sql; execute stmt; deallocate prepare stmt; end loop get_user; close user_cursor; end// -- 必须顶格写(无缩进) delimiter ;
永久解决方案
关闭sqlyog的自动分隔功能:
菜单栏 → 工具 → 首选项 → 查询编辑器
取消勾选"自动分隔sql语句"
使用批处理执行模式:
全选所有代码(包括delimiter)
按
ctrl+shift+f9
(批处理执行)而非普通执行
检查编辑器设置:
确保没有开启"智能缩进"或"语法感知缩进"功能
为什么命令行不受影响?
mysql原生命令行客户端:
完全依赖delimiter指令
不关心缩进和格式
直到遇到定义的结束符(如//)才会执行
而sqlyog等图形工具为提高易用性,会尝试自动解析sql结构,导致对格式敏感。
最佳实践建议
存储过程创建语句建议:
delimiter和end//必须顶格
过程体内的缩进保持一致性(4空格或1个tab)
复杂过程建议:
-- 顶格 delimiter // create procedure proc_name() begin -- 缩进内容 select * from table; end// -- 顶格 delimiter ;
保存为脚本文件后通过命令行执行:
mysql -u user -p db_name < procedure.sql
到此这篇关于sqlyog中delimiter执行存储过程时出现的前置缩进问题的解决方法的文章就介绍到这了,更多相关sqlyog delimiter出现前置缩进内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论