mysql> 客戶端輸出。| 類別 | 說明 | 範例 |
|---|---|---|
| DML | INSERT, UPDATE, DELETE, SELECT, REPLACE | CREATE PROCEDURE p() DELETE FROM t; |
| DDL (MySQL 延伸) | CREATE, DROP, ALTER 等 | CREATE PROCEDURE p() DROP TABLE t; |
| 事務控制 | SET, COMMIT, ROLLBACK | CREATE PROCEDURE p() SET @x = 5; |
| 直接 SELECT (MySQL 延伸) | 無需 INTO 變量,直接回傳結果集 | CREATE PROCEDURE p() SELECT 'a'; |
標準 SQL 將 DDL 定義為可選組件,MySQL 納入核心支援。
複合語句 (BEGIN ... END) 中使用 DECLARE 定義區域變量:
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;//
變量僅在 BEGIN/END 區塊內有效 (類似形參)。
-- 建立主表與從表 (InnoDB 支援外鍵)
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 ... HANDLER 捕獲特定錯誤碼 (如 1216)。INSERT INTO error_log ... 記錄錯誤資訊。RESIGNAL / SIGNAL (5.5+) 重新拋出或自定義錯誤。完整異常處理範例請參考後續進階章節。