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

MySQL 5.0 新特性教學:存儲過程進階(第二講)

     編輯:MySQL 資料庫相關知識

存儲過程主體允許的 SQL 語句

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;

特徵子句(Characteristics Clauses)

子句位於參數列表之後、主體之前,均為可選:

  • 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)

主體包含多條語句時必須用 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;

練習:建立顯示 "Hello world" 的過程

CREATE PROCEDURE p4() SELECT 'Hello, world';
CALL p4();  -- 輸出 Hello, world

下一講將深入探討流程控制、游標與錯誤處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved