(八)自定義函數(shù)


1、自定義函數(shù)

用戶自定義函數(shù)(user-defined function,UDF)是一種對(duì)MySQL擴(kuò)展的途徑,其用法與內(nèi)置函數(shù)相同。

函數(shù)的兩個(gè)必要條件:

  1. 參數(shù)
  2. 返回值

但實(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ù)體:

  1. 函數(shù)體由合法的SQL語句構(gòu)成;
  2. 函數(shù)體可以是簡(jiǎn)單的SELECT語句或INSERT語句;
  3. 函數(shù)體如果為復(fù)合結(jié)構(gòu),則使用BEGIN……END語句包含;
  4. 復(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)明作者以及原文出處,謝謝合作!             ↓↓↓
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容