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

MySQL 存儲過程 DECLARE 變數聲明全解析:作用域、預設值與巢狀塊實戰

     編輯:MySQL 資料庫相關知識

DECLARE 基本規則

  • 只能出現在 `BEGIN ... END` 複合語句**開頭**,先於任何其他語句。
  • 語法:`DECLARE var_name[, var_name]... type [DEFAULT value];`
  • 無 `DEFAULT` 子句時初始值為 `NULL`。
  • 變數名**不加 `@` 前綴**(`@` 為用戶會話變數),區分大小寫不敏感。
  • 作用域限於所在 `BEGIN...END` 塊,巢狀塊內同名變數遮蔽外層。

四大實戰範例

1. 多變數分開聲明 + 後續 SET 賦值

CREATE PROCEDURE p8()
BEGIN
  DECLARE a INT;
  DECLARE b INT;
  SET a = 5; SET b = 5;
  INSERT INTO t VALUES (a);
  SELECT s1 * a FROM t WHERE s1 >= b;
END

2. 無 DEFAULT 子句,完全依賴 SET

CREATE PROCEDURE p9()
BEGIN
  DECLARE a INT;  -- 初始 NULL
  DECLARE b INT;
  SET a = 5; SET b = 5;  -- 必須顯式賦值
  ...
END

3. 合併聲明 + DEFAULT 子句(推薦)

CREATE PROCEDURE p10()
BEGIN
  DECLARE a, b INT DEFAULT 5;  -- 同類型多變數合併,直接預設
  INSERT INTO t VALUES (a);
  SELECT s1 * a FROM t WHERE s1 >= b;
END

執行 `CALL p10()` 返回 `s1*a` 結果集(示例中 `s1=5`,結果 `25` 兩行)。

4. 巢狀塊作用域遮蔽演示

CREATE PROCEDURE p11()
BEGIN
  DECLARE x1 CHAR(5) DEFAULT 'outer';
  BEGIN
    DECLARE x1 CHAR(5) DEFAULT 'inner';  -- 遮蔽外層 x1
    SELECT x1;  -- 輸出 'inner'
  END;
  SELECT x1;  -- 輸出 'outer'
END

`CALL p11()` 依序返回 `inner`、`outer` 兩個單行結果集,直觀驗證作用域規則。

最佳實踐建議

  1. 統一使用 `DECLARE a, b INT DEFAULT val;` 合併同類型變數,減少代碼行數、避免忘記賦值。
  2. 變數命名加前綴(如 `v_`、`p_`)區分欄位名,防止歧義。
  3. 巢狀塊僅在邏輯必要時使用,避免變數遮蔽導致難以除錯。
  4. 需跨塊傳值時,使用 `OUT` 參數或會話變數 (`@var`)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved