MySQL 5.0 引入存儲過程、觸發器、視圖等企業級功能。存儲過程是儲存在資料庫端的預編譯 SQL 程式碼塊,具備模組化、可重複使用、減少網路傳輸、跨平台可攜性等優勢。雖然 MySQL 的實作較晚,但遵循 SQL:2003 標準,語法與 Oracle、DB2 相近,學習曲線平緩。
安裝或升級至 5.0 後,必須執行權限表升級腳本,否則存儲過程無法運作:
mysql_fix_privilege_tables
或
mysql_install_db
驗證版本:
SELECT VERSION(); -- 應顯示 5.0.x
CREATE DATABASE db5;
USE db5;
CREATE TABLE t (s1 INT);
INSERT INTO t VALUES (5);
因存儲過程內含多條 SQL 語句 (以分號結尾),預設分號會讓客戶端誤判結束。需先自訂分隔符 (如 //):
DELIMITER //
還原預設:DELIMITER ;
CREATE PROCEDURE p1 ()
BEGIN
SELECT * FROM t;
END //
CREATE PROCEDURE:關鍵字。p1:過程名稱 (不區分大小寫,長度限制 64 字元)。():參數列表 (此處為空,但括號不可省略)。BEGIN ... END:程式主體區塊,包含一或多條 SQL 語句。CREATE PROCEDURE procedure1 (IN parameter1 INTEGER)
BEGIN
DECLARE variable1 CHAR(10);
IF parameter1 = 17 THEN
SET variable1 = 'birds';
ELSE
SET variable1 = 'beasts';
END IF;
INSERT INTO table1 VALUES (variable1);
END //
此範例展示:參數傳入 (IN)、區域變數宣告 (DECLARE)、流程控制 (IF/ELSE/END IF) 、變數指派 (SET) 及 DML 操作。
CALL p1();DROP PROCEDURE IF EXISTS p1;SHOW CREATE PROCEDURE p1;pi) 命名過程,否則呼叫時需加空格區分:CALL pi ();。資料庫名.過程名 避免名稱衝突。