1、用户自定义(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。
自定义函数的两个必要条件:
(1)参数(理论上来讲参数数量不能超过1024个)
(2)返回值(所有的函数都有返回值)
函数可以返回任意类型的值,同样可以接收这些类型的参数。
函数的返回值和参数没有内在的必然的联系。
2、创建自定义函数
CREATE FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL|DECIMAL}
routine_body(函数体)
3、创建不带有参数的自定义函数
mysql> SELECT NOW(); #显示现在的时间
+---------------------+| NOW() |+---------------------+| 2017-03-29 15:47:07 |+---------------------+mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); #对时间进行格式化
+--------------------------------------------------+| DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') |+--------------------------------------------------+| 2017年03月29日 15点:51分:23秒 |mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
-> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); #创建函数(把对时间的处理封装起来,后面就可以调用)Query OK, 0 rows affected (0.06 sec)mysql> SELECT f1(); #函数调用
+-------------------------------+| f1() |+-------------------------------+| 2017年03月29日 15点:55分:16秒 |+-------------------------------+4、MySQL创建带有参数的自定义函数
mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
-> RETURNS FLOAT(10,2) UNSIGNED -> RETURN (num1+num2)/2;Query OK, 0 rows affected (0.00 sec)mysql>
mysql> SELECT f2(2,4);+---------+| f2(2,4) |+---------+| 3.00 |+---------+5、创建具有复合结构函数体的自定义函数
mysql> SELECT * FROM test;
+----+----------+| id | username |+----+----------+| 1 | John || 2 | Mary |+----+----------+2 rows in set (0.00 sec)mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED -> RETURN -> INSERT test(username) VALUES(username); #最后的分号被认为是mysql命令的结束,根本不会有返回值ERROR 1064 (42000): You have an error in your SQL syntax; check the manualcorresponds to your MySQL server version for the right syntax to use near 'username) VALUES(username)' at line 4mysql>mysql> DELIMITER // #修改默认的mysql分隔符(以后所有的命令都要通过//来结束)
mysql>mysql> SELECT VERSION(); -> //+-----------+| VERSION() |+-----------+| 5.5.54 |+-----------+mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED -> RETURN -> INSERT test(username) VALUES(username); -> LAST_INSERT_ID(); -> // #出错原因:有两个语句需要执行(先插入记录,再返回ID),所以为复合结构,需要BEGIN...END语句ERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near 'test(username) VALUES(username);LAST_INSERT_ID()' at line 4mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED -> BEGIN -> INSERT test(username) VALUES(username); -> RETURN LAST_INSERT_ID(); -> END -> //Query OK, 0 rows affected (0.01 sec)mysql> SELECT adduser('Rose');
-> //+-----------------+| adduser('Rose') |+-----------------+| 9 |+-----------------+1 row in set (0.03 sec)mysql> DELIMITER ; #修改mysql分隔符为;
mysql>mysql> SELECT adduser('Hello');+------------------+| adduser('Hello') |+------------------+| 10 |+------------------+1 row in set (0.02 sec)mysql> SELECT * FROM test;
+----+----------+| id | username |+----+----------+| 1 | John || 2 | Mary || 9 | Rose || 10 | Hello |+----+----------+6、删除函数
DROP FUNCTION [IF EXISTS] function_name