1、自定義函數(shù)
用戶自定義函數(shù)(user-defined function,UDF)是一種對(duì)MySQL擴(kuò)展的途徑,其用法與內(nèi)置函數(shù)相同。
函數(shù)的兩個(gè)必要條件:
- 參數(shù)
- 返回值
但實(shí)際上參數(shù)與返回值之間并沒有什么必然的聯(lián)系,函數(shù)可以沒有參數(shù),但都必然有返回值。例如函數(shù)VERSION()并不需要參數(shù),但是有返回值;而函數(shù)POWER()雖然有底數(shù)和指數(shù)這兩個(gè)參數(shù),但只有一個(gè)返回值。
函數(shù)可以返回任意類型的值,同樣可以接收這些類型的參數(shù),對(duì)于MySQL而言,理論上的參數(shù)數(shù)量上限為1024個(gè),這對(duì)日常的各項(xiàng)開發(fā)來說是完全足夠的。
創(chuàng)建自定義函數(shù)
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL | DECIMAL}
routine_body
COMMENT ' STRING ':
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER }
可以理解為:
創(chuàng)建函數(shù)
創(chuàng)建者,省略即為當(dāng)前登錄到MySQL的用戶
函數(shù)名
特性
函數(shù)體
關(guān)于特性:
- CONTAINS SQL:包含SQL語句,但不包含讀或?qū)憯?shù)據(jù)的語句;
- NO SQL:不包含SQL語句;
- READS SQL DATA:包含讀數(shù)據(jù)的語句;
- MODIFIES SQL DATA:包含寫數(shù)據(jù)的語句;
- SQL SECURITY { DEFINER | INVOKER }:指明誰有權(quán)限來執(zhí)行
關(guān)于函數(shù)體:
- 函數(shù)體由合法的SQL語句構(gòu)成;
- 函數(shù)體可以是簡(jiǎn)單的SELECT語句或INSERT語句;
- 函數(shù)體如果為復(fù)合結(jié)構(gòu),則使用BEGIN……END語句包含;
- 復(fù)合結(jié)構(gòu)可以包含聲明、循環(huán)、控制結(jié)構(gòu)。
2、創(chuàng)建不帶參數(shù)的自定義函數(shù)
以函數(shù)NOW()為例,如果需要修改顯示時(shí)間的格式,每次都需要輸入更多的代碼會(huì)比較繁瑣:
此時(shí)就可以創(chuàng)建自定義函數(shù)解決這一問題:
之后每次使用時(shí)只需要調(diào)用函數(shù)f1()即可。
2、創(chuàng)建帶有參數(shù)的自定義函數(shù)
以求平均數(shù)為例,創(chuàng)建自定義函數(shù)f2():
之后調(diào)用函數(shù)f2()并填入?yún)?shù),便可求得結(jié)果:
3、創(chuàng)建具有復(fù)合結(jié)構(gòu)函數(shù)體的自定義函數(shù)
創(chuàng)建數(shù)據(jù)表“test”并插入兩條記錄用于演示:
通過自定義函數(shù)實(shí)現(xiàn)插入記錄并返回該條記錄的“id”值:
此時(shí)系統(tǒng)報(bào)錯(cuò),雖然輸入函數(shù)體并沒有結(jié)束,但因?yàn)樵摋lSQL語句結(jié)束而輸入“;”,結(jié)果系統(tǒng)認(rèn)為是整個(gè)語句輸入完畢而執(zhí)行了,因此導(dǎo)致錯(cuò)誤。針對(duì)這一問題可以使用DELIMITER暫時(shí)修改分隔符予以解決:
之后就可以繼續(xù)完成函數(shù)體了:
但此時(shí)系統(tǒng)再次報(bào)錯(cuò),原因是有兩條需要執(zhí)行的語句,分別是插入用戶名及返回最后插入的id值,因此就需要使用之前提到的“BEGIN……END”包含來構(gòu)成完整的聚合體:
現(xiàn)在就可以正常使用該自定義函數(shù):
最后可以改回默認(rèn)的分隔符“:”,并刪除自定義函數(shù):
語法結(jié)構(gòu)
DROP FUNCTION [IF EXISTS] function_name
4、自定義函數(shù)的SQL語句匯總:
創(chuàng)建自定義函數(shù)
CREATE FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL | DECIMAL}
routine_body刪除自定義函數(shù)
DROP FUNCTION [IF EXISTS] function_name
-
修改分隔符
DELIMITER
版權(quán)聲明:歡迎轉(zhuǎn)載,歡迎擴(kuò)散,但轉(zhuǎn)載時(shí)請(qǐng)標(biāo)明作者以及原文出處,謝謝合作! ↓↓↓