📅  最后修改于: 2020-11-19 00:57:50             🧑  作者: Mango
MySQL中的存储函数是一组执行某些任务/操作并返回单个值的SQL语句。它是MySQL中存储程序的类型之一。创建存储函数,请确保您具有CREATE ROUTINE数据库特权。通常,我们使用此函数来封装可在存储程序或SQL语句中重用的通用业务规则或公式。
存储的函数几乎类似于MySQL中的过程,但是有一些区别,如下所示:
因此,当我们的方案的目的是计算和只返回一个值,或创建一个用户定义的函数,我们会考虑存储的函数。
在MySQL中创建存储函数的语法如下:
DELIMITER $$
CREATE FUNCTION fun_name(fun_parameter(s))
RETURNS datatype
[NOT] {Characteristics}
fun_body;
存储的函数语法使用下面讨论的以下参数:
Parameter Name | Descriptions |
---|---|
fun_name | It is the name of the stored function that we want to create in a database. It should not be the same as the built-in function name of MySQL. |
fun_parameter | It contains the list of parameters used by the function body. It does not allow to specify IN, OUT, INOUT parameters. |
datatype | It is a data type of return value of the function. It should any valid MySQL data type. |
characteristics | The CREATE FUNCTION statement only accepted when the characteristics (DETERMINISTIC, NO SQL, or READS SQL DATA) are defined in the declaration. |
fun_body | This parameter has a set of SQL statements to perform the operations. It requires at least one RETURN statement. When the return statement is executed, the function will be terminated automatically. The function body is given below:
BEGIN |
通过示例让我们了解存储函数如何在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();
我们将得到如下输出: