MySQL(10)---自定義函式
阿新 • • 發佈:2019-05-07
MySQL(10)---自定義函式
之前講過儲存過程,儲存過程和自定義函式還是非常相似的,其它的可以認為和儲存過程是一樣的,比如含義,優點都可以按儲存過程的優點來理解。
儲存過程相關部落格:
1、MySQL(7)---儲存過程
2、MySQL(8)---遊標
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)