MySQL存储函数
简介:在本教程中,您将学习如何使用CREATE FUNCTION语句创建存储函数。
存储函数是一种特殊的存储程序,它返回单个值。
通常,您使用存储函数来封装可在SQL语句或存储程序之间重用的通用公式或业务规则。
与存储过程不同,无论在何处使用表达式,都可以在SQL语句中使用存储函数。
这有助于提高过程代码的可读性和可维护性。
要创建存储的函数,请使用CREATE FUNCTION语句。
MySQL CREATE FUNCTION语法
下面说明了创建新存储函数的基本语法:
DELIMITER $$ CREATE FUNCTION function_name( param1, param2,… ) RETURNS datatype [NOT] DETERMINISTIC BEGIN -- statements END $$ DELIMITER ;
使用以下语法:
首先,在CREATE FUNCTION关键字之后指定要创建的存储函数的名称。
其次,在括号内列出存储函数的所有参数,然后是函数名称。
默认情况下,所有参数均为IN参数。
您不能为参数指定IN,OUT或INOUT修饰符
第三,在RETURNS语句中指定返回值的数据类型,可以是任何有效的MySQL数据类型。
第四,使用DETERMINISTIC关键字指定函数是否具有确定性。
对于相同的输入参数,确定性函数始终返回相同的结果,而对于相同的输入参数,非确定性函数始终返回不同的结果。
如果您不使用DETERMINISTIC或NOT DETERMINISTIC,则MySQL默认使用NOT DETERMINISTIC选项。
第五,在BEGIN END块的存储函数的主体中编写代码。
在主体部分中,您需要至少指定一个RETURN语句。
RETURN语句向调用程序返回一个值。
每当到达RETURN语句时,存储函数的执行就会立即终止。
MySQL CREATE FUNCTION示例
让我们以创建存储函数为例。
我们将使用示例数据库中的customers表进行演示。
以下CREATE FUNCTION语句创建一个基于信用返回客户级别的函数:
DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;
创建函数后,可以在MySQL Workbench中的"函数"部分下查看它:
或者,您可以使用SHOW FUNCTION STATUS来查看当前classicmodels数据库中的所有存储函数,如下所示:
SHOW FUNCTION STATUS WHERE db = 'classicmodels';
在SQL语句中调用存储的函数
以下语句使用CustomerLevel存储的功能:
SELECT customerName, CustomerLevel(creditLimit) FROM customers ORDER BY customerName;
在存储过程中调用存储函数
以下语句创建一个新的存储过程,该存储过程调用CustomerLevel()存储的函数:
DELIMITER $$ CREATE PROCEDURE GetCustomerLevel( IN customerNo INT, OUT customerLevel VARCHAR(20) ) BEGIN DECLARE credit DEC(10,2) DEFAULT 0; -- get credit limit of a customer SELECT creditLimit INTO credit FROM customers WHERE customerNumber = customerNo; -- call the function SET customerLevel = CustomerLevel(credit); END$$ DELIMITER ;
以下说明了如何调用GetCustomerLevel()存储过程:
CALL GetCustomerLevel(-131,@customerLevel); SELECT @customerLevel;
重要的是要注意,如果存储的函数包含从表中查询数据的SQL语句,则不应在其他SQL语句中使用它;否则,存储的函数将减慢查询速度。
在本教程中,您学习了如何创建存储函数来封装通用公式或业务规则。