SQLyog中DELIMITER執(zhí)行存儲過程時出現(xiàn)前置縮進(jìn)問題的解決方法
問題根源
SQLyog的語句分隔邏輯:
SQLyog默認(rèn)會根據(jù)分號(
;
)和換行自動分隔SQL語句當(dāng)代碼有縮進(jìn)時,SQLyog可能錯誤地將縮進(jìn)后的內(nèi)容識別為新的SQL語句
DELIMITER的敏感性:
DELIMITER //
命令必須獨(dú)立一行且無前導(dǎo)空格任何縮進(jìn)都會導(dǎo)致SQLyog將其視為普通文本而非指令
存儲過程體內(nèi)的語句:
過程體內(nèi)的縮進(jìn)不會影響執(zhí)行(因為是作為整體解析)
但過程體外的命令(如DELIMITER)必須無縮進(jìn)
正確寫法示例
-- 必須頂格寫(無縮進(jìn)) DELIMITER // CREATE PROCEDURE grant_role_to_all_users() BEGIN -- 這里面的縮進(jìn)不會影響執(zhí)行 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// -- 必須頂格寫(無縮進(jìn)) DELIMITER ;
永久解決方案
關(guān)閉SQLyog的自動分隔功能:
菜單欄 → 工具 → 首選項 → 查詢編輯器
取消勾選"自動分隔SQL語句"
使用批處理執(zhí)行模式:
全選所有代碼(包括DELIMITER)
按
Ctrl+Shift+F9
(批處理執(zhí)行)而非普通執(zhí)行
檢查編輯器設(shè)置:
確保沒有開啟"智能縮進(jìn)"或"語法感知縮進(jìn)"功能
為什么命令行不受影響?
MySQL原生命令行客戶端:
完全依賴DELIMITER指令
不關(guān)心縮進(jìn)和格式
直到遇到定義的結(jié)束符(如//)才會執(zhí)行
而SQLyog等圖形工具為提高易用性,會嘗試自動解析SQL結(jié)構(gòu),導(dǎo)致對格式敏感。
最佳實踐建議
存儲過程創(chuàng)建語句建議:
DELIMITER和END//必須頂格
過程體內(nèi)的縮進(jìn)保持一致性(4空格或1個tab)
復(fù)雜過程建議:
-- 頂格 DELIMITER // CREATE PROCEDURE proc_name() BEGIN -- 縮進(jìn)內(nèi)容 SELECT * FROM table; END// -- 頂格 DELIMITER ;
保存為腳本文件后通過命令行執(zhí)行:
mysql -u user -p db_name < procedure.sql
到此這篇關(guān)于SQLyog中DELIMITER執(zhí)行存儲過程時出現(xiàn)的前置縮進(jìn)問題的解決方法的文章就介紹到這了,更多相關(guān)SQLyog DELIMITER出現(xiàn)前置縮進(jìn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用innodb_force_recovery解決MySQL崩潰無法重啟問題
這篇文章主要介紹了使用innodb_force_recovery解決MySQL崩潰無法重啟問題,這只一個成功案例,并不是萬能的解決方法,需要酌情考慮,需要的朋友可以參考下2015-05-05MySQL數(shù)據(jù)庫中刪除重復(fù)記錄簡單步驟
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中刪除重復(fù)記錄的相關(guān)資料,在使用數(shù)據(jù)庫時,出現(xiàn)重復(fù)數(shù)據(jù)是常有的情況,但有些情況是允許數(shù)據(jù)重復(fù)的,而有些情況是不允許的,當(dāng)出現(xiàn)不允許的情況,我們就需要對重復(fù)數(shù)據(jù)進(jìn)行刪除處理,需要的朋友可以參考下2023-08-08mysql 5.7 數(shù)據(jù)庫安裝步驟個人總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫安裝步驟個人總結(jié),需要的朋友可以參考下2017-09-09IOS 數(shù)據(jù)庫升級數(shù)據(jù)遷移的實例詳解
這篇文章主要介紹了IOS 數(shù)據(jù)庫升級數(shù)據(jù)遷移的實例詳解的相關(guān)資料,這里提供實例幫助大家解決數(shù)據(jù)庫升級及數(shù)據(jù)遷移的問題,需要的朋友可以參考下2017-07-07MySQL8.0.21.0社區(qū)版安裝教程(圖文詳解)
這篇文章主要介紹了MySQL8.0.21.0社區(qū)版安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式
這篇文章主要介紹了MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05mysql中復(fù)制表結(jié)構(gòu)的方法小結(jié)
這篇文章主要介紹了mysql中復(fù)制表結(jié)構(gòu)的方法,需要的朋友可以參考下2014-07-07