📜  MySQL存储功能

📅  最后修改于: 2020-11-19 00:57:50             🧑  作者: Mango

MySQL存储函数

MySQL中的存储函数是一组执行某些任务/操作并返回单个值的SQL语句。它是MySQL中存储程序的类型之一。创建存储函数,请确保您具有CREATE ROUTINE数据库特权。通常,我们使用此函数来封装可在存储程序或SQL语句中重用的通用业务规则或公式。

存储的函数几乎类似于MySQL中的过程,但是有一些区别,如下所示:

  • 函数参数可能仅包含IN参数,但不允许指定此参数,而该过程可以允许IN,OUT和INOUT参数
  • 存储的函数只能返回在函数头中定义的单个值。
  • 也可以在SQL语句内调用存储的函数。
  • 它可能不会产生结果集。

因此,当我们的方案的目的是计算和只返回一个值,或创建一个用户定义的函数,我们会考虑存储的函数。

在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
— 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();

我们将得到如下输出: