MySQL儲存函數詳解

2020-07-16 10:05:29
儲存函數和儲存過程一樣,都是在資料庫中定義一些 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 ] <函數名>