1. 程式人生 > >MySQL(10)---自定義函式

MySQL(10)---自定義函式

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)