MySQL 5.0 引入存儲過程支持,本教程從零開始構建概念,覆蓋語法規範、變量聲明、流程控制、異常處理與實戰案例。
mysql> 提示符,-> 續行符| 類別 | 說明 | 示例 |
|---|---|---|
| 標準 SQL DDL | 核心功能,可移植 | CREATE PROCEDURE p() DELETE FROM t; |
| 事務控制 | SET、COMMIT、ROLLBACK | CREATE PROCEDURE p() SET @x = 5; |
| MySQL 擴展 DDL | 非核心可選組件 | CREATE PROCEDURE p() DROP TABLE t; |
| MySQL 擴展 DML | 直接 SELECT 返回結果集 | CREATE PROCEDURE p() SELECT 'a'; |
包含 MySQL 擴展功能的代碼將失去跨數據庫移植性,架構設計時需權衡。
僅在 BEGIN ... END 複合語句塊內有效(類似局部變量/形參)。
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;
-- 主鍵表
CREATE TABLE t2 (s1 INT, PRIMARY KEY (s1)) ENGINE=InnoDB;
-- 外鍵表
CREATE TABLE t3 (s1 INT, KEY (s1), FOREIGN KEY (s1) REFERENCES t2(s1)) ENGINE=InnoDB;
-- 插入不存在的外鍵值觸發錯誤
INSERT INTO t3 VALUES (5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
CREATE TABLE error_log (error_message CHAR(80));
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
BEGIN
INSERT INTO error_log VALUES (CONCAT('FK Error: ', SQLERRM));
END;
DECLARE ... HANDLER FOR condition_value ...SQLSTATE、MYSQL_ERRNO、SQLEXCEPTION、SQLWARNING、NOT FOUNDCONTINUE(繼續執行)、EXIT(退出當前塊)、UNDO(回滾,暫未實現)PREPARE/EXECUTE)SQLSTATE 而非 MySQL 特有錯誤碼,提升可移植性