用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。
-
自定义函数的两个必要条件:
- 参数
- 返回值.
-
函数可以返回任意类型的值,同样可以接收这些类型的参数
-
创建自定义函数
CREATE FUNCTION function_ name
RETURNS { STRING | INTEGER | REAL | DECIMAL }
routine_body
- 关于函数体
-
函数体由合法的SQL语句构成;
-
函数体可以是简单的SELECT或INSERT语句;
-
函数体如果为复合结构则使用BEGIN…END语句;
-
复合结构可以包含声明,循环,控制结构。
-
创建一个无参的自定义函数
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
-> RETURN DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时:%i分:%s秒'
-> );
Query OK, 0 rows affected (0.01 sec)
# 调用函数
mysql> SELECT f1();
+--------------------------------+
| f1() |
+--------------------------------+
| 2019年02月20日 19时:18分:20秒 |
+--------------------------------+
1 row in set (0.00 sec)
创建一个有参的自定义函数
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.01 sec)
# 调用函数
mysql> SELECT f2(10, 25);
+------------+
| f2(10, 25) |
+------------+
| 17.50 |
+------------+
1 row in set (0.00 sec)
创建具有符合结构函数的自定义函数
- 创建数据表
mysql> CREATE TABLE test(
-> id TINYINT(3) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) DEFAULT NULL
-> );
Query OK, 0 rows affected (0.02 sec)
- 插入数据
mysql> INSERT test (username) VALUES(John);
mysql> INSERT test (username) VALUES('111');
- 查看表结构
mysql> DESC test;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
- 修改MySQL默认的结束符 DELIMITER
mysql> DELIMITER //
mysql> SELECT NOW();
-> //
+---------------------+
| NOW() |
+---------------------+
| 2019-02-20 22:38:48 |
+---------------------+
1 row in set (0.00 sec)
- 创建一个函数,实现向 test 表中插入一条数据,并返回该条数据的 id 号
mysql> 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.00 sec)
# 调用函数
mysql> SELECT adduser('Rose');
-> //
+-----------------+
| adduser('Rose') |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.01 sec)
# 改回MySQL默认的结束符
mysql> DELIMITER ;
mysql> SELECT * FROM test;
+----+----------+
| id | username |
+----+----------+
| 1 | John |
| 2 | 111 |
| 3 | Rose |
+----+----------+
3 rows in set (0.00 sec)
删除函数
DROP FUNCTION [IF EXISTS] function name
mysql> DROP FUNCTION f2;
Query OK, 0 rows affected (0.03 sec)