MySQL 5.0 存儲過程主體可包含 INSERT、UPDATE、DELETE、SELECT、DROP、CREATE、REPLACE 等語句。標準 SQL 中任何 DDL(如 CREATE TABLE)、SET、COMMIT、ROLLBACK 均合法。MySQL 延伸功能允許 DML(如 DROP TABLE)與直接 SELECT(無 INTO 子句)。
限制: 過程主體不可包含對例程或資料表操作的 DDL(如 CREATE PROCEDURE、DROP PROCEDURE、CREATE TRIGGER 等),也不可使用 USE database(MySQL 預設以過程所在資料庫為工作環境)。
語法:CALL procedure_name()(括號不可省略)。呼叫過程等同執行其主體內的 SQL 語句。例如:
CREATE PROCEDURE p1() SELECT * FROM t;
CALL p1(); -- 等同於 SELECT * FROM t;
子句位於參數列表之後、主體之前,均為可選:
LANGUAGE SQL:標示主體使用 SQL 撰寫(預設值,為相容 DB2 等異構資料庫保留)。NOT DETERMINISTIC / DETERMINISTIC:告知最佳化器相同輸入是否必然產生相同輸出(目前 MySQL 尚未據此最佳化)。SQL SECURITY DEFINER | INVOKER:DEFINER(預設)執行時檢查建立者權限;INVOKER檢查呼叫者權限。COMMENT 'string':儲存於過程定義中的註釋。若全省略,等同於 LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''。
| 模式 | 說明 |
|---|---|
IN | 輸入參數(預設),值從呼叫端傳入。 |
OUT | 輸出參數,值在過程內設定並回傳給呼叫端。 |
INOUT | 雙向參數,可輸入也可輸出。 |
範例:
-- IN
CREATE PROCEDURE p5(p INT) SET @x = p;
CALL p5(12345); SELECT @x; -- 12345
-- OUT
CREATE PROCEDURE p6(OUT p INT) SET p = -5;
CALL p6(@y); SELECT @y; -- -5
主體包含多條語句時必須用 BEGIN ... END 區塊包裹,內部可宣告變數、流程控制:
CREATE PROCEDURE p7()
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
下一講將深入探討流程控制、游標與錯誤處理。