MySQL 缺乏像 Oracle PL/SQL Developer 這類圖形化除錯工具。最輕量、無需建表、即時可見的除錯技巧:在關鍵點插入 SELECT 變數名; 直接輸出到客戶端。
CREATE PROCEDURE `p_next_id`(
IN kind_name VARCHAR(30),
IN i_length INT,
IN currentSeqNo VARCHAR(3),
OUT o_result INT
)
BEGIN
DECLARE a INT DEFAULT NULL;
DECLARE b INT DEFAULT NULL;
SELECT id INTO a FROM t_seq WHERE number = currentSeqNo AND length = i_length;
SELECT a; -- 除錯點 1: 檢查查詢結果
IF (a IS NULL) THEN
SELECT MIN(id) INTO a FROM t_seq WHERE length = i_length;
SELECT number INTO b FROM t_seq WHERE id = a;
SELECT b; -- 除錯點 2: 檢查 fallback 邏輯
ELSE
SELECT number INTO b FROM t_seq WHERE id = a + 1;
END IF;
SELECT b INTO o_result;
SELECT o_result; -- 除錯點 3: 確認輸出參數
END
# 在 mysql CLI 執行
mysql> CALL p_next_id('t_factory', 2, '0', @result);
+------+
| a |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
+------+
| b |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
+----------+
| o_result |
+----------+
| 100 |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
# 查看 OUT 參數最終值
mysql> SELECT @result;
+--------+
| @result|
+--------+
| 100 |
+--------+
't_factory', 2, '0', @result
3. 執行後,結果分頁會顯示每個 SELECT 的輸出網格
CREATE PROCEDURE debug_demo(IN p_id INT)
BEGIN
DECLARE v_cnt INT;
DECLARE v_name VARCHAR(50);
-- 區段標記,便於識別
SELECT '=== START ===' AS _debug;
SELECT COUNT(*) INTO v_cnt FROM users WHERE id = p_id;
SELECT v_cnt AS _debug_cnt;
IF v_cnt = 0 THEN
SELECT 'NOT FOUND' AS _debug_msg;
ELSE
SELECT name INTO v_name FROM users WHERE id = p_id;
SELECT v_name AS _debug_name;
-- 複雜邏輯中間檢查
UPDATE users SET last_login = NOW() WHERE id = p_id;
SELECT ROW_COUNT() AS _debug_affected;
END IF;
SELECT '=== END ===' AS _debug;
END
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
SELECT 變數 | 零成本、即時、無副作用 | 輸出混雜在結果集中 | 開發階段、簡單邏輯 |
| 寫入臨時表 | 結構化、可查詢歷程 | 需建表、有寫入開銷 | 複雜流程、需追蹤多步驟 |
INSERT INTO log_table | 永久保存、可加時間戳 | 需維護日誌表、影響效能 | 生產環境審計、事後分析 |
| MySQL Workbench Debugger | 斷點、單步、變數監視 | 僅支援特定版本、設定繁瑣 | 深度邏輯除錯 |
| Performance Schema | 無侵入、官方標準 | 資訊粒度粗、需 5.7+ | 生產效能分析 |
SELECT 變數;,上線前批次刪除或用條件編譯控制。DECLARE debug_mode TINYINT DEFAULT 1; -- 1=開啟, 0=關閉 IF debug_mode THEN SELECT 'checkpoint 1', var1, var2; END IF;
_debug_,避免與業務欄位衝突。SELECT out_param; 確認回傳值。「SELECT @var; 是 MySQL 開發者的 console.log——簡單、直接、永遠可用。」