MySQL 存储函数
在MySQL中,存储函数是一组执行某些任务/操作并返回单个值的SQL语句。它是MySQL中存储程序的一种类型。创建存储函数时,确保您具有CREATE ROUTINE数据库权限。通常,我们使用该函数封装常见业务规则或在存储程序或SQL语句中可重用的公式。
存储函数与MySQL中的存储过程几乎相似,但有一些不同之处,如下所示:
- 函数参数只能包含 输入参数 ,不能允许指定此参数,而存储过程可以允许 输入,输出,输入/输出参数 。
- 存储函数只能返回在函数头中定义的单个值。
- 存储函数也可以在SQL语句中被调用。
- 它可能不会产生结果集。
因此,在我们的程序目的只是计算和返回单个值或创建用户定义函数时,我们将考虑使用存储函数。
在MySQL中创建存储函数的语法如下:
使用的参数
存储函数语法使用以下参数,详细讨论如下:
参数名称 | 描述 |
---|---|
fun_name | 这是我们想在数据库中创建的存储函数的名称。它不应该与MySQL的内置函数名称相同。 |
fun_parameter | 它包含函数体使用的参数列表。不允许指定IN、OUT、INOUT参数。 |
datatype | 它是函数返回值的数据类型。应该是任何有效的MySQL数据类型。 |
characteristics | 只有在声明中定义了特性(DETERMINISTIC、NO SQL或READS SQL DATA),CREATE FUNCTION语句才会被接受。 |
fun_body | 此参数包含一组用于执行操作的SQL语句。它需要至少一个RETURN语句。当执行RETURN语句时,函数将自动终止。函数体如下所示: BEGIN -- SQL statements END $$ DELIMITER |
MySQL存储函数示例
让我们通过示例来了解MySQL中存储函数的工作原理。假设我们的数据库有一个名为 “customer” 的表,其中包含以下数据:
现在,我们将创建一个函数,根据年龄返回 客户职业 使用以下语句。
DELIMITER CREATE FUNCTION Customer_Occupation(
age int
)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE customer_occupation VARCHAR(20);
IF age>35 THEN
SET customer_occupation = 'Scientist';
ELSEIF (age <= 35 AND age >= 30) THEN
SET customer_occupation = 'Engineer';
ELSEIF age<30 THEN
SET customer_occupation = 'Actor';
END IF;
-- return the customer occupation
RETURN (customer_occupation);
END
DELIMITER;
在命令行工具上执行上述语句,如下所示:
一旦函数创建成功,我们可以在MySQL工作台的Function部分中看到它,如下图所示:
我们还可以使用以下语句查看当前数据库中的所有存储函数:
SHOW FUNCTION STATUS WHERE db = 'mysqltestdb';
执行上述命令后,我们将得到以下输出结果:
存储函数调用
现在,我们将看到如何使用SQL语句调用存储函数。以下语句使用 customer_occupation 存储函数来获取结果:
SELECT name, age, Customer_Occupation(age)
FROM customer ORDER BY age;
它将输出如下。
我们还可以在另一个存储过程(如过程、函数、触发器或任何其他MySQL内置函数)中调用上述函数。
过程中的存储函数调用
在这里,我们将看到如何在存储过程中调用此函数。该语句在数据库中创建一个使用 Customer_Occupation() 存储函数的过程。
DELIMITER CREATE PROCEDURE GetCustomerDetail()
BEGIN
SELECT name, age, Customer_Occupation(age) FROM customer ORDER BY age;
END
DELIMITER ;
以下语句可用于调用存储过程:
CALL GetCustomerDetail();
我们会得到以下输出结果: