MySQL 存儲過程是一種預編譯的數據庫代碼塊,可以執行一系列的 SQL 語句并返回結果。通過存儲過程,我們可以在數據庫服務器上編寫邏輯代碼,避免將大量的計算和邏輯操作傳輸到客戶端,從而減少通訊帶寬和網絡延遲。此外,存儲過程還可以提高數據庫的安全性和可維護性。
MySQL 存儲過程的語法格式如下:
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name [ (parameter_list) ] [characteristic ...] routine_body parameter_list: [ IN | OUT | INOUT ] param_name datatype [(length)] [, ...] datatype: TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT | FLOAT | DOUBLE | DECIMAL | DATE | DATETIME | TIMESTAMP | TIME | YEAR | VARCHAR | CHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | BLOB | MEDIUMBLOB | LONGBLOB | BINARY | VARBINARY routine_body: Valid SQL routine statement
其中,sp_name
是存儲過程的名稱;parameter_list
是存儲過程的參數列表,可以包含輸入參數、輸出參數和輸入輸出參數,它們的數據類型在datatype
中定義;routine_body
是存儲過程的代碼體,可以包含一系列的 SQL 語句,例如 SELECT、UPDATE、DELETE、INSERT 等等。
下面是一個簡單的 MySQL 存儲過程的例子:
CREATE PROCEDURE get_customer(IN customer_id INT, OUT customer_name VARCHAR(50)) BEGIN SELECT Name INTO customer_name FROM Customers WHERE CustomerID = customer_id; END
上面的存儲過程接受一個輸入參數customer_id
,并將匹配的客戶名稱存儲在輸出參數customer_name
中。
執行存儲過程的語法如下:
CALL sp_name(param1, param2, ...);
例如,執行上面的存儲過程:
CALL get_customer(1, @name); SELECT @name;
將會返回結果:
+------------+ | @name | +------------+ | Alfreds | +------------+
除了基本的 SQL 語句,MySQL 存儲過程還支持流程控制語句(如 IF、WHILE、REPEAT 等等)、變量、臨時表和游標等高級功能,可以完成更為復雜的業務邏輯。