| 類別 | 範例 | 說明 |
|---|---|---|
| DML | INSERT/UPDATE/DELETE/SELECT | 核心業務邏輯 |
| DDL | CREATE/DROP/ALTER TABLE | MySQL 擴展功能 (標準列為可選) |
| 事務 | COMMIT/ROLLBACK | 標準支援 |
| 會話 | SET @var = 5 | 標準支援 |
| 直接 SELECT | SELECT 'a' | MySQL 擴展 (無 FROM 子句) |
禁止:建立/修改/刪除 過程/函數/觸發器、USE database、資料庫管理語句 (CACHE INDEX/FLUSH/LOCK/REPAIR 等)。
MySQL> CALL p1();
+------+
| s1 |
+------+
| 5 |
+------+
1 row in set (0.03 sec)
等同於直接執行過程體內的 `SELECT * FROM t;`。括號不可省略。
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t;
| 子句 | 預設值 | 說明 |
|---|---|---|
| LANGUAGE SQL | SQL | 僅說明用,未來可能支援其他語言 |
| DETERMINISTIC / NOT DETERMINISTIC | NOT DETERMINISTIC | 提示優化器:相同輸入是否必得相同輸出 (目前未啟用優化) |
| SQL SECURITY DEFINER / INVOKER | DEFINER | 執行權限上下文:建立者 vs 調用者 |
| COMMENT | '' | 備註文字,存入 metadata |
省略所有子句等同於上述預設值組合。
CREATE PROCEDURE p5 (IN p INT) SET @x = p; -- 輸入
CREATE PROCEDURE p6 (OUT p INT) SET p = -5; -- 輸出
CREATE PROCEDURE p7 (INOUT p INT) SET p = p * 2; -- 雙向
CREATE PROCEDURE p8 ()
BEGIN
SET @a = 5; SET @b = 5;
INSERT INTO t VALUES (@a);
SELECT s1 * @a FROM t WHERE s1 >= @b;
END;
CREATE PROCEDURE p4 () SELECT 'Hello, world';
CALL p4(); -- 輸出 Hello, world