MySQL 預設以分號 ; 判斷 SQL 語句結束。存儲過程、觸發器、函數內部包含多條以分號結束的語句,若不變更結束符,客戶端會在第一個分號處送出執行,導致語法錯誤。
-- 變更結束符為 //
DELIMITER //
CREATE PROCEDURE demo()
BEGIN
SELECT 1;
SELECT 2; -- 內部分號不會結束整個定義
END //
-- 恢復預設分號
DELIMITER ;
//(最常用)$$||;、,、\ 等特殊字元。DELIMITER //
DROP PROCEDURE IF EXISTS pr_stat_agent //
CREATE PROCEDURE pr_stat_agent(
IN pi_date_from DATE,
IN pi_date_to DATE
)
BEGIN
IF pi_date_from IS NULL THEN
SET pi_date_from = CURDATE();
END IF;
IF pi_date_to IS NULL THEN
SET pi_date_to = pi_date_from;
END IF;
SET pi_date_to = DATE_ADD(pi_date_from, INTERVAL 1 DAY);
SELECT agent, COUNT(*) AS cnt
FROM apache_log
WHERE request_time >= pi_date_from
AND request_time < pi_date_to
GROUP BY agent
ORDER BY cnt DESC;
END //
DELIMITER ;
DELIMITER //(無分號),結束用 //,最後 DELIMITER ;。SOURCE /path/file.sql 或 \. /path/file.sql 可直接執行檔案,無需手動輸入 DELIMITER。| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 定義中途被截斷執行 | 未設 DELIMITER | 定義前 DELIMITER // |
| DELIMITER //; 導致結束符變成 //; | 指令後多加分號 | 只輸入 DELIMITER // 不加分號 |
| 巢狀 BEGIN/END 報錯 | 未正確配對 | 檢查每個 BEGIN 對應 END |
-- 在 SQL 檔案開頭統一設定
DELIMITER $$
-- 所有程式定義...
DELIMITER ;
-- 命令列一次執行
mysql> SOURCE /path/procs.sql