儲存函數和儲存過程一樣,都是在資料庫中定義一些 SQL 語句的集合。儲存函數可以通過 return 語句返回函數值,主要用於計算並返回一個值。而儲存過程沒有直接返回值,主要用於執行操作。
在 MySQL 中,使用
CREATE FUNCTION 語句來建立儲存函數,其語法形式如下:
CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body
其中:
-
sp_name 引數:表示儲存函數的名稱;
-
func_parameter:表示儲存函數的參數列;
-
RETURNS type:指定返回值的型別;
-
characteristic 引數:指定儲存函數的特性,該引數的取值與儲存過程是一樣的;
-
routine_body 引數:表示 SQL 程式碼的內容,可以用 BEGIN...END 來標示 SQL 程式碼的開始和結束。
注意:在具體建立函數時,函數名不能與已經存在的函數名重名。除了上述要求外,推薦函數名命名(識別符號)為 function_xxx 或者 func_xxx。
func_parameter 可以由多個引數組成,其中每個引數由引數名稱和引數型別組成,其形式如下:
[IN | OUT | INOUT] param_name type;
其中:
-
IN 表示輸入引數,OUT 表示輸出引數,INOUT 表示既可以輸入也可以輸出;
-
param_name 引數是儲存函數的引數名稱;
-
type 引數指定儲存函數的引數型別,該型別可以是 MySQL 資料庫的任意資料型別。
例 1
使用 CREATE FUNCTION 建立查詢 tb_student 表中某個學生姓名的函數,SQL 語句和執行過程如下:
mysql> USE test;
Database changed
mysql> DELIMITER //
mysql> CREATE FUNCTION func_student(id INT(11))
-> RETURNS VARCHAR(20)
-> COMMENT '查詢某個學生的姓名'
-> BEGIN
-> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
-> END //
Query OK, 0 rows affected (0.10 sec)
mysql> DELIMITER ;
上述程式碼中,建立了 func_student 函數,該函數擁有一個型別為 INT(11) 的引數 id,返回值為 VARCHAR(20) 型別。SELECT 語句從 tb_student 表中查詢 id 欄位值等於所傳入引數 id 值的記錄,同時返回該條記錄的 name 欄位值。
建立函數與建立儲存過程一樣,需要通過命令
DELIMITER //
將 SQL 語句的結束符由“;”修改為“//”,最後通過命令
DELIMITER ;
將結束符號修改成 SQL 語句中預設的結束符號。
如果在儲存函數中的 RETURN 語句返回一個型別不同於函數的 RETURNS 子句中指定型別的值,返回值將被強制為恰當的型別。比如,如果一個函數返回一個 ENUM 或 SET 值,但是 RETURN 語句返回一個整數,對於 SET 成員集的相應的 ENUM 成員,從函數返回的值是字串。
拓展閱讀
由於儲存函數和儲存過程的檢視、修改、刪除等操作幾乎相同,所以我們不再詳細講解如何操作儲存函數了。
檢視儲存函數的語法如下:
SHOW FUNCTION STATUS LIKE 儲存函數名;
SHOW CREATE FUNCTION 儲存函數名;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=儲存函數名;
可以發現,操作儲存函數和操作儲存過程不同的是將 PROCEDURE 替換成了 FUNCTION。同樣,修改儲存函數的語法如下:
ALTER FUNCTION 儲存函數名 [ 特徵 ... ]
儲存函數的特徵與儲存過程的基本一樣。
刪除儲存過程的語法如下:
DROP FUNCTION [ IF EXISTS ] <函數名>