MySQL自定義函數(四十六)


 

 

 

MySQL自定義函數

一、什么是MYSQL自定義函數?

  mysql當中的自定義函數,我們簡稱為UDF,它實際上是一種對MySQL擴展的途徑,其用法與內置函數相同。

 

 

二、自定義函數應該具備哪些條件?

  我們先來回想一下內置函數是怎么使用的,首先函數一定要有一個名字,還有每個函數后面都有一個小括號,小括號里面寫的內容我們稱之為參數,當函數正常運行時,往往會得到一個信息,這個信息我們稱之為返回值。所以我們可以發現,自定義函數應該具備兩個條件:

(1)參數

(2)返回值

  不僅是自定義函數需要這兩個條件,我們可以發下系統自定義函數也需要這兩個條件,當然參數並不是任何函數必備的條件,比如之前學的那個查看mysql版本的函數VERSION(),他並沒有參數,但是有返回值,所以說參數和返回值之間並沒有必然的聯系。更詳細點說,就是可以沒有參數,但是會有返回值,當然也可以有兩個或多個參數但是只有一個返回值,所以說函數一定有返回值,但是參數就不一定了。

  函數可以返回任意類型的值,同樣可以接收這些類型的參數,這句話就說明函數的返回值和參數可以為我們之前所學的任意一種數據類型,那么參數的數目有什么要求呢?在mysql當中,理論上講,參數的數目不能超過1024個,我想這對於任何的函數都足夠了,這就是對參數和返回值的一個簡單的說明。

 

 

 

三、自定義函數的語法結構

CREATE FUNCTION function_name

RETURNS

{STRING|INTEGER|REAL|DECIMAL}

routine_body

  那么如果我現在要創建一個函數,就需要通過CREATE FUNCTION 這個語句,后面加上函數名,RETURNS后面跟上返回值類型,routine_body指函數體。

 

 

 

四、關於函數體的幾點說明

(1)函數體由合法的SQL語句構成;

(2)函數體可以是簡單的SELECT或INSERT語句;

(3)函數體如果為復合結構則使用BEGIN....END語句;

(4)復合結構可以包含聲明、循環、控制語句;

 

 

五、創建自定義函數

  我們先來改一下編碼方式為gbk,我們輸入SET NAMES gbk;這里改變只影響我們客戶端的編碼方式,不影響服務器的編碼方式,也就是說如果我在客戶端寫漢字的話,我們需要gbk,但是寫入到數據庫中,仍然是我們數據庫當中默認的編碼方式,因為我們的數據庫是存在服務器端的。

  1、我們先來創建一個無參的自定義函數,比如我們前面學過NOW()函數,我們輸入SELECT NOW();

  我們發現是這種形式,如果我們現在要改成漢字的形式,就是X年X月X日,類似這種,那么就需要用到DATA_FORMAT()這個函數,比如我們輸入SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');

  我們發現就變成了這種形式,如果我要經常使用這個功能,如果每次使用我都這樣寫,是不是會很麻煩呀,我們可不可以將這個過程封裝成一個自定義函數,答案是肯定的,所以我們就可以這樣寫,我們輸入

CREATE FUNCTION f1() RETURNS VARCHAR(30)

RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒') ;

  OK,這個函數我們就創建成功了,當我們需要用的時候,我們就調用它,比如我們可以直接輸入SELECT f1();

  我們發現也能達到我們想要的結果,很明顯這樣調用起來就更方便了。這就是簡單的給大家演示一個簡單的無參的自定義函數。

 

 

2、我們也可以自定義有參的自定義函數,假設我們現在寫一個可以計算兩個數平均值的函數,比如我們輸入

CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)

RETURNS FLOAT(10,2) UNSIGNED

RETURN (num1+num2)/2;

  OK,這個函數創建成功,現在我們來調用一下,我們輸入SELECT f2();

  我們發現報錯,因為我們沒有傳入參數,那我們就傳入倆參數。

  OK。我們發現就計算出來了平均值。當然我們也可以按照這種方式去定義3個參數或更多。

 

 

3、下面我們再來定義一個帶有多個參數的函數,我們還以test表為例,我們先來看一下test表的結構,我們輸入DESC test;

  我們發現只有id和username字段,而且id字段還是自增的,現在我們想通過函數往數據表中插入數據,我們先來看一下表中的數據,我們輸入SELECT * FROM test;

  現在我們來定義一個函數來插入數據,我們輸入CREATE FUNCTION adduser(username

VARCHAR(20))

RETURNS INT UNSIGNED

RETURN

INSERT test(username) VALUES(username);

  這個時候,系統提示我們錯誤,為什么會出現這個錯誤呢?原因很簡單,就是我們的分號被認為是mysql命令的結束,因為這里邊根本就不存在int類型的返回值,這個時候我們就要通過DELIMITER來修改mysql默認的分隔符,我們輸入DELIMITER//這兩條斜線是什么意思呢,就是說以后你所有的命令都是通過//來結束的。

  比如我們輸入SELECT VERSION();這里我們輸入分號就不管用,必須輸入//(我們重新指定的兩條斜線),這樣就可以避免掉我們在上一條命令中再出現分號結束的情況,當然你也可以指定其他的結束符。

  下面我們重新執行上面的命令,比如再加上LAST_INSERT_ID;我們再在后面加上//

  我們發現又報錯了,這是為什么呢?因為現在我們有兩個語句要返回執行,那么我們就需要加上BEGIN。。。AND,構成一個聚合體,好,我們重新輸入,(一二行不變),然后輸入BEGIN

INSERT test(username) VALUES(username);

RETURN LAST_INSERT_ID();

END

//

  OK,命令執行成,下面我們來調用我們剛剛自定義的函數,看是否能插入這個字段。

  我們輸入SELECT adduser('Hello');

//

  ok,命令執行成功,字段也插入成功,說明這個自定義函數定義成功,下面我們再把這個結束符改為分號,我們輸入DELIMITER ;

  OK,我們再來插入一條,我們輸入SELECT adduser('Tom');

  OK,插入成功,下面我們來查看一下,SELECT * FROM test;

  我們發現這就是我們想要的結果,OK,這就是最簡單的自定義函數,實際上在開發過程中,用到系統內置的函數比較少,所以我們最好掌握一下標准的自定義函數。

 

 

 

六、刪除函數

  刪除函數的語法結構

DROP FUNCTION [IF EXISTS] function_name

  這個相對比較簡單,大家自己練習一下就行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM