首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.0 存儲過程進階教程(二):合法語句、CALL 調用、特性子句、參數模式、復合語句

     編輯:MySQL 資料庫相關知識

一、過程體內合法 SQL 語句

類別範例說明
DMLINSERT/UPDATE/DELETE/SELECT核心業務邏輯
DDLCREATE/DROP/ALTER TABLEMySQL 擴展功能 (標準列為可選)
事務COMMIT/ROLLBACK標準支援
會話SET @var = 5標準支援
直接 SELECTSELECT 'a'MySQL 擴展 (無 FROM 子句)

禁止:建立/修改/刪除 過程/函數/觸發器、USE database、資料庫管理語句 (CACHE INDEX/FLUSH/LOCK/REPAIR 等)。

二、CALL 調用存儲過程

MySQL> CALL p1();
+------+
| s1   |
+------+
| 5    |
+------+
1 row in set (0.03 sec)

等同於直接執行過程體內的 `SELECT * FROM t;`。括號不可省略。

三、特性子句 (Characteristics Clauses)

CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t;
子句預設值說明
LANGUAGE SQLSQL僅說明用,未來可能支援其他語言
DETERMINISTIC / NOT DETERMINISTICNOT DETERMINISTIC提示優化器:相同輸入是否必得相同輸出 (目前未啟用優化)
SQL SECURITY DEFINER / INVOKERDEFINER執行權限上下文:建立者 vs 調用者
COMMENT''備註文字,存入 metadata

省略所有子句等同於上述預設值組合。

四、參數模式:IN / OUT / INOUT

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;   -- 雙向
  • `IN` 可省略 (預設)
  • 呼叫輸出參數需用會話變量接收:`CALL p6(@y); SELECT @y;` → `-5`

五、復合語句:BEGIN ... END

  • 封裝多條語句,類 Pascal `BEGIN/END` 或 C `{}`
  • 區塊內可 `DECLARE` 區域變量、條件、游標、HANDLER
  • 單條語句可省略 `BEGIN/END`
CREATE PROCEDURE p8 ()
BEGIN
    SET @a = 5; SET @b = 5;
    INSERT INTO t VALUES (@a);
    SELECT s1 * @a FROM t WHERE s1 >= @b;
END;

練習:Hello World 過程

CREATE PROCEDURE p4 () SELECT 'Hello, world';
CALL p4();  -- 輸出 Hello, world
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved