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

MySQL 存儲過程變量聲明與賦值完全指南

     編輯:MySQL 資料庫相關知識

變量是存儲過程邏輯控制的核心。本文系統梳理 MySQL 存儲過程中局部變量的聲明語法、作用域規則、賦值方式及常見陷阱,助你編寫健壯的過程化代碼。

一、 變量聲明語法

DECLARE var_name [, var_name] ... type [DEFAULT value];
  • 位置限制: 必須在 BEGIN ... END 塊的最開頭,先於任何其他語句。
  • 作用域: 僅在聲明所在的 BEGIN ... END 及其嵌套塊內有效。
  • 不區分大小寫: 變量名、關鍵字均不敏感。
  • 一次可聲明多個同類型變量: 用逗號分隔。

示例

DECLARE v_start_date DATE DEFAULT '2024-01-01';
DECLARE v_count INT DEFAULT 0;
DECLARE v_name VARCHAR(100);

二、 賦值方式

1. SET 直接賦值

SET var_name = expr [, var_name = expr] ...

expr 可以是常量、表達式、函數調用等任意返回值的合法表達式。

SET v_today = CURDATE();
SET v_start = DATE_SUB(CURDATE(), INTERVAL 1 MONTH), v_end = CURDATE();

2. SELECT ... INTO 查詢賦值

SELECT col_name [, ...] INTO var_name [, ...] FROM table_expr ...

硬性要求: 查詢必須恰好返回 一行,否則報錯(0 行或 >1 行)。

實戰範例:計算客戶欠款

CREATE FUNCTION get_balance(p_cust_id INT, p_as_of DATETIME)
RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE v_paid DECIMAL(10,2) DEFAULT 0;
    
    SELECT IFNULL(SUM(amount), 0) INTO v_paid
    FROM payment
    WHERE cust_id = p_cust_id AND pay_date <= p_as_of;
    
    RETURN v_paid; -- 簡化邏輯,實際可加總應收減實收
END;

三、 常見錯誤與最佳實踐

錯誤場景後果修正
DECLARE 放在非首行語法錯誤移至 BEGIN 後首行
SELECT INTO 返回多行Runtime Error 1172加 LIMIT 1 或聚合函數
變量名與列名衝突歧義導致邏輯錯誤變量加前綴 v_、p_ 區分
未初始化直接使用值為 NULL 導致計算異常聲明時用 DEFAULT 或緊跟 SET

四、 進階:會話變量 vs 局部變量

  • 局部變量 (DECLARE): 存儲過程內部,強類型,作用域受限。
  • 用戶會話變量 (@var): 跨過程/會話可見,弱類型,SET @x = 1 即可使用,無需聲明。

存儲過程內優先用局部變量,避免副作用;需跨調用鏈傳遞狀態時才考慮會話變量。

五、 總結

掌握 DECLARE 位置規則、SET 與 SELECT INTO 兩種賦值模式、單行返回限制,即可駕馭 90% 存儲過程變量場景。良好的命名規範(v_ 開頭局部、p_ 開頭參數)與初始化習慣,能大幅減少調試時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved