回顧和概述
內置函數庫:
- 字符函數
- 數值函數
- 日期時間函數
- 加密函數
如果需要一些系統沒有提供的函數,就需要自定義函數了
自定義函數簡介
自定義函數:用戶自定義函數(user-defined function,UDF)是一種對MySQL擴展的途徑,其用法與內置函數相同。
自定義函數的兩個必要條件:
1.參數(可以為空)
2.返回值
函數可以返回任意類型的值,同樣可以接收這些類型的參數
函數參數和返回值沒有必然的練習
在MySQL中,函數參數的數量理論上不能超過1024個,這個數量對于大部分開發都足夠了
創建自定義函數
CREATE FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL | DECIMAL}
routine_body
關于函數體
1.函數體由合法的SQL語句構成
2.函數體可以是簡單的SELECT或INSERT語句
3.函數體如果為復合結構則使用BEGIN...END語句
4.復合結構可以包含聲明,循環,控制結構
創建不帶參數的自定義函數
創建一個函數,使之返回的日期格式為:Y年m月d日 H點:i分:s秒
使用sql語句可以這樣實現:
首先設置客戶端編碼方式(只是設置客戶端顯示的編碼方式,不會影響服務端):
SET NAME gbk;
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H時:%i分:%s秒');#把當前日期格式化成“Y年m月d日 H點:i分:s秒”的形式
但是如果我們以后要使用這個函數,就要每次這樣寫,如果把它封裝成一個函數,以后使用就會很方便
CREATE FUNCTION f1() RETURNS VACHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H時:%i分:%s秒');
調用:
SELECT f1();#結果為格式化后的當前日期
創建帶有參數的自定義函數
寫一個計算兩個數的平均值的函數
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALL UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
調用:
SELECT f2(10,15);結果為12.5。如果沒有提供參數會報錯
如果系統本來已經存在了一個函數名為f2的函數,那么在再次創建名為f2的函數時就會報錯,可以使用DROP FUNCTION f2;
刪除函數
創建具有復合結構函數體的自定義函數
數據庫中有一張表,結構如下
數據庫中有兩條記錄:
創建一個函數,可以向表中插入一條記錄并返回新插入的id
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
RETURN
INSERT test (username) VALUES(username);#會報錯,因為系統會認為”;“為MySQL的語句結束,而不是一條函數語句的結束
修改MySQL的語句結束符號為”//“,DELIMITER //
也有些人習慣修改成$
修改后MySQL只有在遇到"http://"后才會執行
如:
SELECT VERSION();#回車后還讓繼續輸入
//#再輸入"http://"后才會執行
再次創建
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
RETURN
INSERT test (username) VALUES(username);
LAST_INSERT_ID();
//
依然提示錯誤,因為有兩條語句需要執行,這是就需要加上BEGIN...END構成聚合體
再次創建
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT test (username) VALUES(username);
RETURN LAST_INSERT_ID();
END
//
創建成功
調用:
把分隔符修改回去:DELIMITER ;
SELECT adduser('Rose');#返回值是3
SELECT adduser('Tom');#返回值是4
使用SELECT * FROM test;
查看表結構可以看到已經插入成功
實際開發中自定義函數用的不多,知道如何創建就行了
刪除函數:
DROP FUNCTION [IF EXISTS] function_name