MySQL之自定義函數實例講解


轉自:https://www.2cto.com/database/201804/740205.html

MySQL中已經有很多函數,如時間函數等,但是有時這些函數不能滿足自己的設計需求,此時需要自定義函數,用戶自定義函數(User-defined functuin,UDF)是對MySQL的擴展,其用法和內置函數相同

函數需要具備:參數 返回值

對於函數體中的部分可以是:

1、函數體由合法的SQL語句組成

2、函數體可以是簡單的select或者insert語句

3、函數體若為復合結構則使用begin...end語句

4、復合結構可以包含聲明、循環、控制結構

1、無參數

知道通過now()函數可以顯示日期和時間,如果想把這個時間表達成:“年月日時分秒” 的形式怎么辦呢?通過使用格式化函數DATE_FORMAT()

?
1
mysql> select DATE_FORMAT(NOW(), '%Y年%m月%d日 %H點:%i分:%s秒' );

\

由於該過程書寫較為麻煩,如果經常使用很不方便,因此將其“制作”成函數

?
1
2
mysql> create FUNCTION f1() returns varchar (30)
     -> RETURN DATE_FORMAT(NOW(), '%Y年:%m月:%d日 %H點:%i分:%s秒' );

\

由於在定義f1()的時候沒有參數,因此調用時就可以直接調用

?
1
mysql> select f1();

2、帶有參數

帶有一個以上的參數時,這里求解兩個數的平均數

?
1
2
3
mysql> create FUNCTION f2(num1 smallint unsigned,num2 smallint unsigned)  #函數名
     -> RETURNS FLOAT (10,2) UNSIGNED       #返回值的類型
     -> RETURN (num1+num2)/2;              #返回值

\

3、創建具有復合結構的函數

首先創建一個數據表test

?
1
2
3
root@localhost test> create table test(id tinyint(3) unsigned primary key auto_increment,
     -> username varchar (30) not null
     -> );

\

現在想往數據表中插入記錄,返回值是新插入的記錄的id號

?
1
root@localhost test> insert into test values ( default , 'Lj.K' );

由於分號是命令的結束,因此這里需要修改默認的分隔符,否則在輸入分號之后無法返回新插入記錄的id,因此使用命令

?
1
DELIMITER 分隔符

這樣所有的命令均需要以分隔符來結束

\

比這將分隔符修改為//,則所有命令均需要以 // 為結束

?
1
2
3
4
5
6
7
root@localhost test> create FUNCTION adduser(username varchar (20))  #創建添加參數名為username的函數adduser
     -> RETURNS INT UNSIGNED
     -> BEGIN
     -> INSERT test(username) VALUES (username);
     -> RETURN LAST_INSERT_ID();
     -> END
     -> //

這里因為有兩條語句 insert test(username) values(username)和return last_insert_id()兩條語句要執行,因此需要使用BEGIN...END語句,從而構成聚合體

?
1
2
root@localhost test> select  adduser( 'Rose' );
     -> //

\

?
1
2
root@localhost test>DELIMITER ;
root@localhost test> select  adduser( 'Tom' );

\

通過drop function命令進行刪除


免責聲明!

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



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