以前講過存儲過程,存儲過程和自定義函數仍是很是類似的,其它的能夠認爲和存儲過程是同樣的,好比含義,優勢均可以按存儲過程的優勢來理解。
存儲過程相關博客:html
一、MySQL(7)---存儲過程mysql
二、MySQL(8)---遊標sql
三、MySQL(9)---紀錄一次實際開發過程當中用到的複雜存儲過程c#
它們惟一不不一樣點
在於函數
存儲過程
:能夠有0個返回,也能夠有多個返回,適合作批量插入、批量更新
函數
:有且僅有1 個返回,適合作處理數據後返回一個結果。3d
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型 BEGIN 函數體 END /* 注意: 一、參數列表 包含兩部分:參數名 參數類型 二、函數體:確定會有return語句,若是沒有會報錯 若是return語句沒有放在函數體的最後也不報錯,但不建議 三、函數體中僅有一句話,則能夠省略begin end 四、使用 delimiter語句設置結束標記 */
SELECT 函數名(參數列表)
SHOW FUNCTION STATUS;
DROP FUNCTION IF EXISTS function_name;
先把例子須要用到表給出code
# 商品表 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');
#案例:返回商品的個數 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()$
# 案例:根據商品名稱返回商品價格 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('手錶') $
這個會發現報異常htm
緣由
在存儲過程或者函數,傳人蔘數是中文的時候,那麼就須要將參數的類型VARCHAR
改爲NVARCHAR
;blog
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)