預存程序與函式將多條 SQL 封裝為單一可呼叫單位,提升重用性、效能與安全性。本文系統說明建立語法、參數模式、流程控制、游標操作與管理指令。
| 特性 | 預存程序 | 函式 |
|---|---|---|
| 回傳值 | 無 (透過 OUT 參數) | 必須有 RETURNS |
| 參數模式 | IN / OUT / INOUT | 僅 IN |
| 呼叫方式 | CALL proc() | SELECT func() |
| SQL 限制 | 可執行 DDL/DML | 不可隱含提交 |
CREATE PROCEDURE proc_name ([IN|OUT|INOUT] param_name type, ...) [characteristic ...] routine_body
LANGUAGE SQL:主體為 SQL (預設)DETERMINISTIC:相同輸入必得相同輸出 (預設)CONTAINS SQL / NO SQL / READS SQL DATA / MODIFIES SQL DATASQL SECURITY DEFINER | INVOKER:定義者/呼叫者權限 (預設 DEFINER)COMMENT 'string'DELIMITER $$
CREATE PROCEDURE proc_employee_sal()
COMMENT '查詢所有員工薪資'
BEGIN
SELECT sal FROM t_employee;
END $$
DELIMITER ;
CREATE FUNCTION func_name ([param_name type, ...]) RETURNS type [characteristic ...] routine_body
DELIMITER $$
CREATE FUNCTION func_employee_sal(empno INT) RETURNS DECIMAL(10,2)
COMMENT '查詢指定員工薪資'
BEGIN
RETURN (SELECT sal FROM t_employee WHERE empno = empno);
END $$
DELIMITER ;
DECLARE var_name TYPE [DEFAULT value]; SET var_name = expr; SELECT col_name INTO var_name FROM table WHERE condition; -- 單行結果
-- 定義條件名稱 DECLARE condition_name CONDITION FOR SQLSTATE '45000'; -- 定義處理器 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @err = 1; DECLARE EXIT HANDLER FOR NOT FOUND SET @done = 1;
DECLARE cur_name CURSOR FOR SELECT ...; OPEN cur_name; FETCH cur_name INTO var1, var2; CLOSE cur_name;
-- 修改特性 ALTER PROCEDURE proc_name [characteristic ...]; ALTER FUNCTION func_name [characteristic ...]; -- 刪除 DROP PROCEDURE proc_name; DROP FUNCTION func_name;
proc_ 前綴程序,func_ 前綴函式DELIMITER 避免分號衝突GRANT EXECUTE ON proc TO user