## 存儲函數
存儲函數是返回單個值的特殊類型的存儲過程。 可以使用存儲函數封裝在 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)