mysql存储过程之存储函数
发布时间:2022-11-09 15:30:08 所属栏目:MsSql教程 来源:
导读: 之前提到过好多次存储函数,这次咱们就来具体看下。它呢,是返回单个值的特殊类型的存储程序。我们通常使用存储的函数来封装在SQL语句或存储的程序中可重用的常用公式或业务规则。与存储过程不同,我们可以在SQL
|
之前提到过好多次存储函数,这次咱们就来具体看下。它呢,是返回单个值的特殊类型的存储程序。我们通常使用存储的函数来封装在SQL语句或存储的程序中可重用的常用公式或业务规则。与存储过程不同,我们可以在SQL语句中使用存储的函数,也可以在表达式中使用, 这有助于提高程序代码的可读性和可维护性。 我们来看下创建新存储函数的最简单语法: CREATE FUNCTION function_name(param1,param2,…) RETURNS datatype [NOT] DETERMINISTIC statements 在上述代码中,在CREATE FUNCTION子句之后指定存储函数的名称,完事之后Mssq存储过程,列出括号内存储函数的所有参数。 默认情况下,所有参数均为IN参数。不能为参数指定IN,OUT或INOUT修饰符。再来datatype就是必须在RETURNS语句中指定返回值的数据类型。它可以是任何有效的mysql数据类型。完事对于相同的输入参数,如果存储的函数返回相同的结果,这样则被认为是确定性的,否则存储的函数不是确定性的。必须决定一个存储函数是否是确定性的。 如果您声明不正确,则存储的函数可能会产生意想不到的结果,或者不使用可用的优化,从而降低性能。最后将代码写入存储函数的主体中。 它可以是单个语句或复合语句。 在主体部分中,必须至少指定一个RETURN语句。RETURN语句用于返回一个值给调用者。 每当到达RETURN语句时,存储的函数的执行将立即终止。 咱们呢,现在在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 $$ 一级存储和二级存储_云存储与传统存储区别_Mssq存储过程 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 运行成功之后,咱们再来重写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语句中使用它; 否则,存储的函数将减慢查询的速度。 (编辑:海洋资讯信息网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

