本文整理自《高可用 MySQL》讀書筆記,系統介紹預存程序中變量的聲明語法、常用數據類型、字面常量、命名規則、參數模式(IN/OUT/INOUT)、用戶變量、註釋與運算符用法。
DECLARE 語句用於創建局部變量,必須置於程式碼塊開頭,位於游標、處理程序與流程控制語句之前。語法:
DECLARE var_name type [DEFAULT value];
| 類型 | 說明 | 範圍/示例 |
|---|---|---|
| INT/INTEGER | 32位整數 | -21億~+21億;無符號可達42億 |
| BIGINT | 64位整數 | -9京~+9京;無符號0~18京 |
| FLOAT | 單精度浮點數 | ±1.7e38;精度約7位數字 |
| DOUBLE | 雙精度浮點數 | ±1.7e308;精度約15位數字 |
| DECIMAL(p,s) | 定點數,精確儲存 | 適合貨幣金額,如 78979.00 |
| DATE | 日期 | '1999-12-31' |
| DATETIME | 日期時間,精確到秒 | '1999-12-31 23:59:59' |
| CHAR(n) | 定長字串,右側填充空格 | 最大255字節 |
| VARCHAR(n) | 變長字串 | 最大64KB |
| TEXT/BLOB | 長文本/二進制數據 | 最大64KB |
| LONGTEXT/LONGBLOB | 超大文本/二進制 | 最大4GB |
DECLARE l_int1 INT DEFAULT -2000000; DECLARE l_int2 INT UNSIGNED DEFAULT 4000000; DECLARE l_bigint1 BIGINT DEFAULT 4000000000000000; DECLARE l_float FLOAT DEFAULT 1.8e8; DECLARE l_double DOUBLE DEFAULT 2e45; DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95; DECLARE l_date DATE DEFAULT '1999-12-31'; DECLARE l_datetime DATETIME DEFAULT '1999-12-31 23:59:59'; DECLARE l_char CHAR(255) DEFAULT 'This will be padded to 255 chars'; DECLARE l_varchar VARCHAR(255) DEFAULT 'This will not be padded'; DECLARE l_text TEXT DEFAULT '長文本內容...';
0x...)'YYYY-MM-DD'、'YYYY-MM-DD HH:MM:SS'| 模式 | 特性 | 說明 |
|---|---|---|
| IN | 預設模式 | 調用者傳入值,程序內修改不影響外部 |
| OUT | 輸出參數 | 初始為 NULL,程序內賦值後返回給調用者 |
| INOUT | 雙向參數 | 調用者傳入,程序可修改並返回新值 |
CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT) BEGIN SELECT p_in; -- 可見初始值 SET p_in = 2; -- 內部修改 SELECT p_in; -- 顯示修改後值 END; SET @p_in = 1; CALL sp_demo_in_parameter(@p_in); SELECT @p_in; -- 仍為 1,外部不可見內部修改
CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT) BEGIN SELECT p_out; -- 顯示 NULL SET p_out = 2; SELECT p_out; -- 顯示 2 END; SET @p_out = 1; CALL sp_demo_out_parameter(@p_out); SELECT @p_out; -- 返回 2,外部可見修改
CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT) BEGIN SELECT p_inout; -- 可見初始值 SET p_inout = 2; SELECT p_inout; -- 顯示修改後值 END; SET @p_inout = 1; CALL sp_demo_inout_parameter(@p_inout); SELECT @p_inout; -- 返回 2
用戶變量屬於會話級別,可跨預存程序邊界讀寫,常用於:
-- 設置用戶變量
SET @greeting = 'Hello';
SELECT CONCAT(@greeting, ' World'); -- Hello World
-- 程序間傳遞
CREATE PROCEDURE p1() SET @last_procedure = 'p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last was ', @last_procedure);
CALL p1(); CALL p2(); -- Last was p1
-- :單行註釋(雙連字符加空格)/* ... */:多行註釋(C 風格)支援標準算術(+ - * /)、比較(= < > <= >= <> !=)、邏輯(AND OR NOT)運算符。不支援 C 風格自增/自減(++、+=)。
CREATE PROCEDURE operators() BEGIN DECLARE a INT DEFAULT 2; DECLARE b INT DEFAULT 3; DECLARE c FLOAT; SET c = a + b; SELECT 'a+b=', c; SET c = a / b; SELECT 'a/b=', c; SET c = a * b; SELECT 'a*b=', c; IF a < b THEN SELECT 'a is less than b'; END IF; IF NOT (a = b) THEN SELECT 'a is not equal to b'; END IF; END;