mysql存储函数_MySQL存储函数

在本教程中,您将学习如何使用CREATE FUNCTION语句创建存储的函数。

存储的函数是返回单个值的特殊类型的存储程序。您使用存储的函数来封装在SQL语句或存储的程序中可重用的常用公式或业务规则。

与存储过程不同,您可以在SQL语句中使用存储的函数,也可以在表达式中使用。 这有助于提高程序代码的可读性和可维护性。

MySQL存储函数语法

以下说明了创建新存储函数的最简单语法:

CREATE FUNCTION function_name(param1,param2,…)

RETURNS datatype

[NOT] DETERMINISTIC

statements

首先,在CREATE FUNCTION子句之后指定存储函数的名称。

其次,列出括号内存储函数的所有参数。 默认情况下,所有参数均为IN参数。不能为参数指定IN,OUT或INOUT修饰符。

第三,必须在RETURNS语句中指定返回值的数据类型。它可以是任何有效的MySQL数据类型。

第四,对于相同的输入参数,如果存储的函数返回相同的结果,这样则被认为是确定性的,否则存储的函数不是确定性的。必须决定一个存储函数是否是确定性的。 如果您声明不正确,则存储的函数可能会产生意想不到的结果,或者不使用可用的优化,从而降低性能。

第五,将代码写入存储函数的主体中。 它可以是单个语句或复合语句。 在主体部分中,必须至少指定一个RETURN语句。RETURN语句用于返回一个值给调用者。 每当到达RETURN语句时,存储的函数的执行将立即终止。

MySQL存储函数示例

我们来看一下使用存储函数的例子,这里将使用示例数据库(yiibaidb)中的customers表进行演示。

以下示例是根据信用额度返回客户级别的功能。 我们使用IF语句来确定信用额度。

DELIMITER $$

CREATE FUNCTION CustomerLevel(p_creditLimit double) RETURNS VARCHAR(10)

DETERMINISTIC

BEGIN

DECLARE lvl varchar(10);

IF p_creditLimit > 50000 THEN

SET lvl = 'PLATINUM';

ELSEIF (p_creditLimit <= 50000 AND p_creditLimit >= 10000) THEN

SET lvl = 'GOLD';

ELSEIF p_creditLimit < 10000 THEN

SET lvl = 'SILVER';

END IF;

RETURN (lvl);

END $$

DELIMITER ;

现在,我们在SELECT语句中调用CustomerLevel()存储函数,如下所示:

SELECT

customerName, CustomerLevel(creditLimit)

FROM

customers

ORDER BY customerName;

执行上面查询语句,得到以下结果 -

+------------------------------------+----------------------------+

| customerName | CustomerLevel(creditLimit) |

+------------------------------------+----------------------------+

| Alpha Cognac | PLATINUM |

| American Souvenirs Inc | SILVER |

| Amica Models & Co. | PLATINUM |

| ANG Resellers | SILVER |

| Anna's Decorations, Ltd | PLATINUM |

| Anton Designs, Ltd. | SILVER |

| Asian Shopping Network, Co | SILVER |

| Asian Treasures, Inc. | SILVER |

| Atelier graphique | GOLD |

| Australian Collectables, Ltd | PLATINUM |

| Australian Collectors, Co. | PLATINUM |

|************** 此处省略了一大波数据 *********************************|

| Vitachrome Inc. | PLATINUM |

| Volvo Model Replicas, Co | PLATINUM |

| Warburg Exchange | SILVER |

| West Coast Collectables Co. | PLATINUM |

+------------------------------------+----------------------------+

122 rows in set

下面,来重写在MySQL IF语句教程中开发的GetCustomerLevel()存储过程,如下所示:

DELIMITER $$

CREATE PROCEDURE GetCustomerLevel(

IN p_customerNumber INT(11),

OUT p_customerLevel varchar(10)

)

BEGIN

DECLARE creditlim DOUBLE;

SELECT creditlimit INTO creditlim

FROM customers

WHERE customerNumber = p_customerNumber;

SELECT CUSTOMERLEVEL(creditlim)

INTO p_customerLevel;

END $$

DELIMITER ;

如您所见,GetCustomerLevel()存储过程在使用CustomerLevel()存储函数时可读性更高。

请注意,存储函数仅返回单个值。 如果没有包含INTO子句的SELECT语句,则将会收到错误。

另外,如果存储的函数包含SQL语句,则不应在其他SQL语句中使用它; 否则,存储的函数将减慢查询的速度。

以下是纠正/补充内容:

RETURNS子句指示函数返回值的类型为{STRINGINTEGERREALDECIMAL}  提交时间:2019-09-10

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值