本篇詳細解析 MySQL 預存程序與函數的建立語法、參數模式、變數作用域、條件處理、游標操作、流程控制結構,以及調用、查看、修改與刪除的完整生命週期管理。
CREATE PROCEDURE sp_name ([proc_parameter]) [characteristics] routine_body
LANGUAGE SQL:主體為 SQL 語句(目前唯一值)DETERMINISTIC:相同輸入必產生相同輸出(優化器提示)CONTAINS SQL / NO SQL / READS SQL DATA / MODIFIES SQL DATA:SQL 資料存取等級SQL SECURITY DEFINER | INVOKER:執行權限檢查模式COMMENT 'string':說明文字DELIMITER // CREATE PROCEDURE Proc() BEGIN SELECT * FROM t3; END // DELIMITER ; CALL Proc();
必須將結束符號從 ; 改為 //,避免程序內部分號提前終止建立語句。
CREATE FUNCTION func_name([func_parameter]) RETURNS type [characteristics] routine_body
關鍵差異:
RETURNS 宣告回傳型別RETURN value 語句IN 模式,不支援 OUT/INOUTRETURNS 有 s,RETURN 無 s,寫錯會語法錯誤DELIMITER // CREATE FUNCTION NameByT() RETURNS CHAR(50) RETURN (SELECT NAME FROM t3 WHERE id = 2); // DELIMITER ; SELECT NameByT(); -- 調用方式同內建函數
DECLARE var_name [, var_name]... type [DEFAULT value]; SET var_name = expr [, var_name = expr]...; SELECT col_name INTO var_name FROM table WHERE ...;
連線層級作用域,跨程序可存取,連線結束自動釋放。
DECLARE condition_name CONDITION FOR SQLSTATE '42000'; -- 或 DECLARE condition_name CONDITION FOR 1148;
DECLARE handler_type HANDLER FOR condition_value sp_statement
CONTINUE:記錄錯誤繼續執行EXIT:離開當前 BEGIN...END 區塊UNDO:回滾(MySQL 暫不支援)條件值:SQLSTATE、mysql_error_code、condition_name、SQLWARNING (01*)、NOT FOUND (02*)、SQLEXCEPTION (其他)。
CREATE PROCEDURE handlerdemo() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO t8 VALUES(1); SET @x = 2; INSERT INTO t8 VALUES(1); -- 重複主鍵觸發處理程序 SET @x = 3; END;
執行後 @x = 3 證明程序未中斷繼續執行至結尾。
僅能在預存程序/函數中使用,須在處理程序宣告前定義。
DECLARE cursor_name CURSOR FOR select_statement;OPEN cursor_name;FETCH cursor_name INTO var_name [, var_name]...;CLOSE cursor_name;| 結構 | 語法關鍵字 | 結束關鍵字 |
|---|---|---|
| IF | IF ... THEN ... ELSEIF ... ELSE ... | END IF |
| CASE | CASE ... WHEN ... THEN ... ELSE ... | END CASE |
| LOOP | [label:] LOOP ... END LOOP | END LOOP |
| REPEAT | REPEAT ... UNTIL condition | END REPEAT |
| WHILE | WHILE condition DO ... | END WHILE |
| LEAVE | LEAVE label | 跳出標籤對應迴圈 |
| ITERATE | ITERATE label | 進入下一次迴圈 |
CALL sp_name([params])SELECT func_name([params])(同內建函數)EXECUTE 權限,資訊存於 information_schema.USER_PRIVILEGESSHOW PROCEDURE STATUS LIKE 'pattern'; SHOW FUNCTION STATUS LIKE 'pattern';
SHOW CREATE PROCEDURE sp_name; SHOW CREATE FUNCTION func_name;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = 'name';
ALTER PROCEDURE sp_name [characteristics]; ALTER FUNCTION func_name [characteristics];
若需修改程式碼,必須 DROP 後重建。
DROP PROCEDURE sp_name; DROP FUNCTION func_name;
CHARACTER SET gbkDECLARE 必須寫在程序內部
