首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DELIMITER 詳細解析:存儲過程、觸發器、函數定義必備技巧

     編輯:MySQL 資料庫相關知識

為什麼需要 DELIMITER

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 ;

命令列 vs 圖形工具差異

  • 命令列:必須用 DELIMITER //(無分號),結束用 //,最後 DELIMITER ;。
  • Navicat / SQLyog / Workbench:通常內建處理,可直接貼上帶分號的完整定義,或提供「執行批次」模式。
  • source 指令:SOURCE /path/file.sql 或 \. /path/file.sql 可直接執行檔案,無需手動輸入 DELIMITER。

常見錯誤與解決

錯誤現象原因解決
定義中途被截斷執行未設 DELIMITER定義前 DELIMITER //
DELIMITER //; 導致結束符變成 //;指令後多加分號只輸入 DELIMITER // 不加分號
巢狀 BEGIN/END 報錯未正確配對檢查每個 BEGIN 對應 END

進階技巧

-- 在 SQL 檔案開頭統一設定
DELIMITER $$

-- 所有程式定義...

DELIMITER ;

-- 命令列一次執行
mysql> SOURCE /path/procs.sql
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved