MySQL(10)---自定義函數
之前講過存儲過程,存儲過程和自定義函數還是非常相似的,其它的可以認為和存儲過程是一樣的,比如含義,優點都可以按存儲過程的優點來理解。
存儲過程相關博客:
3、MySQL(9)---紀錄一次實際開發過程中用到的復雜存儲過程
它們唯一不不同點
在於
存儲過程
:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數
:有且僅有1 個返回,適合做處理數據后返回一個結果。
一、語法
1、創建函數
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
函數體
END
/*
注意:
1、參數列表 包含兩部分:參數名 參數類型
2、函數體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函數體的最后也不報錯,但不建議
3、函數體中僅有一句話,則可以省略begin end
4、使用 delimiter語句設置結束標記
*/
2、調用函數
SELECT 函數名(參數列表)
3、查看函數
SHOW FUNCTION STATUS;
4、刪除函數
DROP FUNCTION IF EXISTS function_name;
二、示例
先把例子需要用到表給出
# 商品表
DROP TABLE IF EXISTS `mall_pro`;
CREATE TABLE `mall_pro` (
`mall_id` char(32) NOT NULL,
`pro_name` varchar(32) DEFAULT '' COMMENT '顯示名稱',
`cash_cost` double(10,1) DEFAULT '0.0' COMMENT '商品價格',
`show_member` int(1) DEFAULT '0' COMMENT '顯示 0所有 1指定會員',
`status` int(1) DEFAULT '1' COMMENT '狀態:1正常 0刪除',
`key_id` varchar(32) DEFAULT '0' COMMENT '會員控件表key',
PRIMARY KEY (`mall_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';
INSERT INTO `mall_pro` (`mall_id`, `pro_name`, `cash_cost`, `show_member`, `status`, `key_id`)
VALUES
('1','手表',100.0,0,1,'0'),
('2','手機',888.0,1,1,'0'),
('3','電腦',3888.0,1,1,'0');
1、無參
#案例:返回商品的個數
DELIMITER $
DROP FUNCTION IF EXISTS myf1;
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;#定義局部變量
SELECT COUNT(*) INTO c#賦值
FROM mall_pro;
RETURN c;
END $
SELECT myf1()$
2、有參
# 案例:根據商品名稱返回商品價格
DELIMITER $
DROP FUNCTION IF EXISTS myf2$
CREATE FUNCTION myf2(proName VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @sal=0;#定義用戶變量
SELECT cash_cost INTO @sal #賦值
FROM mall_pro
WHERE pro_name = proName;
RETURN @sal;
END $
SELECT myf2('手表') $
這個會發現報異常
原因
在存儲過程或者函數,傳人參數是中文的時候,那么就需要將參數的類型VARCHAR
改成NVARCHAR
;
3、實現傳入兩個float,返回二者之和
DELIMITER $
DROP FUNCTION IF EXISTS test_fun$
CREATE FUNCTION test_fun(num1 FLOAT,num2 FLOAT) RETURNS float
BEGIN
DECLARE SUM FLOAT DEFAULT 0;
SET SUM=num1+num2;
RETURN SUM;
END $
SELECT test_fun(1,2)$
總的來講前面講了存儲過程,函數也沒什么好講的了,有什么疑問看存儲過程相關文章應該都懂了。
只要自己變優秀了,其他的事情才會跟着好起來(少將11)