1. 程式人生 > 實用技巧 >MySQL教程108-MySQL儲存函式

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] <儲存函式名>