MySQL教程108-MySQL儲存函式
儲存函式和儲存過程一樣,都是在資料庫中定義一些 SQL 語句的集合。儲存函式可以通過 return 語句返回函式值,主要用於計算並返回一個值。而儲存過程沒有直接返回值,主要用於執行操作。
在 MySQL 中,使用CREATE FUNCTION語句來建立儲存函式,其語法形式如下:
CREATE FUNCTION <儲存函式的名稱> ([儲存函式的引數列表[...]]) RETURNS type [characteristic ...] routine_body
其中:
- RETURNS type:指定返回值的型別;
- characteristic 引數:指定儲存函式的特性,該引數的取值與儲存過程是一樣的;
- routine_body 引數:表示SQL 程式碼的內容,可以用 BEGIN...END 來標示SQL 程式碼的開始和結束。
注意:在具體建立函式時,函式名不能與已經存在的函式名重名。除了上述要求外,推薦函式名命名(識別符號)為 function_xxx 或者 func_xxx。
func_parameter 可以由多個引數組成,其中每個引數由引數名稱和引數型別組成,其形式如下:
param_name type;
其中:
- param_name 引數是儲存函式的引數名稱;
- type 引數指定儲存函式的引數型別,該型別可以是 MySQL 資料庫的任意資料型別。
例 1
使用 CREATE FUNCTION 建立查詢 tb_student_info 表中某個學生姓名的函式,SQL 語句和執行過程如下:
mysql> DELIMITER // mysql> create function func_get_name (id int(4)) -> returns varchar(20) DETERMINISTIC -> begin -> return (select name from tb_student_info f where f.id=id); -> end // Query OK, 0 rows affected, 1 warning (0.25 sec) mysql> DELIMITER ;
注意: DETERMINISTIC的使用
上述程式碼中,建立了 func_get_name 函式,該函式擁有一個型別為 INT(4) 的引數 id,返回值為 VARCHAR(20) 型別。SELECT 語句從 tb_student_info 表中查詢 id 欄位值等於所傳入引數 id 值的記錄,同時返回該條記錄的 name 欄位值。
建立函式與建立儲存過程一樣,需要通過命令DELIMITER //
將 SQL 語句的結束符由“;”修改為“//”,最後通過命令DELIMITER ;
將結束符號修改成 SQL 語句中預設的結束符號。
如果在儲存函式中的 RETURN 語句返回一個型別不同於函式的 RETURNS 子句中指定型別的值,返回值將被強制為恰當的型別。比如,如果一個函式返回一個 ENUM 或 SET 值,但是 RETURN 語句返回一個整數,對於 SET 成員集的相應的 ENUM 成員,從函式返回的值是字串。
拓展
由於儲存函式和儲存過程的檢視、修改、刪除等操作幾乎相同,所以我們不再詳細講解如何操作儲存函數了。可以執行help檢視具體語法操作
檢視儲存函式的語法如下:
SHOW FUNCTION STATUS LIKE 儲存函式名;
mysql> show function status like 'func_get_name'\G; *************************** 1. row *************************** Db: test_db Name: func_get_name Type: FUNCTION Definer: root@% Modified: 2020-08-26 10:31:11 Created: 2020-08-26 10:31:11 Security_type: DEFINER Comment: character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
SHOW CREATE FUNCTION 儲存函式名;
mysql> show create function func_get_name\G; *************************** 1. row *************************** Function: func_get_name sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Function: CREATE DEFINER=`root`@`%` FUNCTION `func_get_name`(id int(4)) RETURNS varchar(20) CHARSET utf8 DETERMINISTIC begin return (select name from tb_student_info f where f.id=id); end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=儲存函式名;
可以發現,操作儲存函式和操作儲存過程不同的是將 PROCEDURE 替換成了 FUNCTION。同樣,修改儲存函式的語法如下:
ALTER FUNCTION 儲存函式名 [ 特徵 ... ]
儲存函式的特徵與儲存過程的基本一樣。
刪除儲存過程的語法如下:
DROP FUNCTION [IF EXISTS] <儲存函式名>