🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 存储函数 存储函数是返回单个值的特殊类型的存储过程。 可以使用存储函数封装在 SQL 语句或存储程序中重复使用的公共公式或业务规则。 创建存储函数语法: CREATE FUNCTION function_name(param1,param2,…) RETURNS datatype [NOT] DETERMINISTIC statements 存储函数定义要点: - 不能为参数指定 IN,OUT 或 INOUT 修饰符, 因为默认所有参数都是 IN 类型的。 - 必须在 RETURNS 语句中指定返回值的数据类型。 它可以是任何有效的 MySQL 数据类型。 - 对于相同的输入参数,如果返回相同的结果,则认为其是可确定的。创建时必须指出可否确定(DETERMINISTIC 或者 NOT DETERMINISTIC)。 - 在正文中必须至少指定一个RETURN 语句。RETURN 语句向调用者返回一个值。 每当达到 RETURN 语句时,立即终止存储函数的执行。 显示存储过程: SHOW FUNCTION STATUS [LIKE 'pattern' | WHERE expr]; 显示存储函数定义: SHOW CREATE FUNCTION function_name; 删除存储函数: DROP FUNCTION [IF EXISTS] function_name; ### 存储函数示例 获取客户货运时间: ``` DELIMITER $$ DROP FUNCTION IF EXISTS get_customer_shipping$$ CREATE FUNCTION get_customer_shipping(p_province varchar(15) charset utf8) RETURNS varchar(15) charset utf8 DETERMINISTIC BEGIN DECLARE p_shipping varchar(15) charset utf8; CASE p_province WHEN '广东' THEN SET p_shipping = '2天货运时间'; WHEN '上海' THEN SET p_shipping = '3天货运时间'; ELSE SET p_shipping = '5天货运时间'; END CASE; RETURN(p_shipping); END$$ DELIMITER ; ``` 函数调用: SELECT customer_id, address, func_get_customer_shipping(customer_id) AS '货运时间' LIMIT 10; 在存储过程中使用存储函数: ``` DELIMITER $$ DROP PROCEDURE IF EXISTS get_customer_shipping2$$ CREATE PROCEDURE get_customer_shipping2( IN p_customer_id int(11), OUT p_shipping varchar(30) charset utf8 ) BEGIN SELECT get_customer_shipping(province) INTO p_shipping FROM customer WHERE customer_id = p_customer_id; END$$ DELIMITER ; ``` 存储调用: SET @p_customer_id = 1020; SELECT province into @p_province FROM customer WHERE customer_id = @p_customer_id; call get_customer_shipping(@p_customer_id, @p_shipping); SELECT @p_customer_id AS Customer, @p_province AS Province, @p_shipping AS Shipping; 参考链接:[存储函数](http://www.studymysql.com/mysql/stored-function.html)