## 存储函数
存储函数是返回单个值的特殊类型的存储过程。 可以使用存储函数封装在 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)