MySQL自定义函数

ゝ一世哀愁。 2022-09-25 12:15 353阅读 0赞

自定义函数:

用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途经,其用法与内置函数相同。

自定义函数有两个必要条件:

  1. 参数
  2. 返回值

函数可以返回任意类型的值,同样可以接收这些类型的参数。

函数的参数和返回值之间没有必然的内在的联系。

示例1:
创建一个无参数的函数,返回当前时间的,年月日 时分秒。
例如:

  1. mysql> SELECT NOW();
  2. +---------------------+
  3. | NOW() |
  4. +---------------------+
  5. | 2016-09-08 21:17:17 |
  6. +---------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
  9. +--------------------------------------------------+
  10. | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') |
  11. +--------------------------------------------------+
  12. | 20160908 21点:19分:54 |
  13. +--------------------------------------------------+
  14. 1 row in set (0.01 sec)

对上述过程经行封装:

  1. mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
  2. -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
  3. Query OK, 0 rows affected (0.08 sec)
  4. mysql> SELECT f1();
  5. +-------------------------------+
  6. | f1() |
  7. +-------------------------------+
  8. | 20160908 21点:21分:25 |
  9. +-------------------------------+
  10. 1 row in set (0.02 sec)

注:returns后面的为返回值类型,return后面的为返回值。

示例2:
创建有参数的函数,例如求两个数的平均值。

  1. mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
  2. -> RETURNS FLOAT(10,2) UNSIGNED
  3. -> RETURN (num1+num2)/2;
  4. Query OK, 0 rows affected (0.00 sec)

调用:

  1. mysql> SELECT f2(4,6);
  2. +---------+
  3. | f2(4,6) |
  4. +---------+
  5. | 5.00 |
  6. +---------+
  7. 1 row in set (0.02 sec)

如果要删除上面所创建的两个自定义函数:

  1. mysql> DROP FUNCTION f2;
  2. Query OK, 0 rows affected (0.11 sec)
  3. mysql> DROP FUNCTION f1;
  4. Query OK, 0 rows affected (0.00 sec)

创建具有复合结构函数体的自定义函数

例如:创建一个函数向表中插入数据,并返回所插入数据的id。

  1. mysql> DESC tdb_test;
  2. +------------+------------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +------------+------------------+------+-----+---------+----------------+
  5. | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
  6. | first_name | varchar(20) | NO | | NULL | |
  7. | last_name | varchar(20) | NO | | NULL | |
  8. +------------+------------------+------+-----+---------+----------------+
  9. 3 rows in set (0.00 sec)
  10. mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20))
  11. -> RETURNS INT UNSIGNED
  12. -> RETURN
  13. -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name);
  14. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name)' at line 4

这时我们发现,在输入要执行的sql语句后,后面的分号为当前默认的分隔符,导致函数无法再继续输入。因此需要修改默认的分隔符。

  1. mysql> DELIMITER //

意思是用//结束

  1. mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20))
  2. -> RETURNS INT UNSIGNED
  3. -> RETURN
  4. -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name);
  5. -> LAST_INSERT_ID();
  6. -> //
  7. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name);
  8. LAST_INSERT_ID()' at line 4

同样返回错误,因为,返回有两个语句要执行,需放入begin和end构成一个聚合体,下面来看正确的做法。

  1. mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20))
  2. -> RETURNS INT UNSIGNED
  3. -> BEGIN
  4. -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name);
  5. -> RETURN LAST_INSERT_ID();
  6. -> END
  7. -> //
  8. Query OK, 0 rows affected (0.00 sec)

再将分隔符改回来

  1. mysql> DELIMITER ;

测试结果如下:

  1. mysql> SELECT adduser("ttt","ddd");
  2. +----------------------+
  3. | adduser("ttt","ddd") |
  4. +----------------------+
  5. | 5 |
  6. +----------------------+
  7. 1 row in set (0.11 sec)
  8. mysql> SELECT * FROM tdb_test;
  9. +----+------------+-----------+
  10. | id | first_name | last_name |
  11. +----+------------+-----------+
  12. | 1 | A | B |
  13. | 2 | Jack | Bob |
  14. | 3 | tom% | 123 |
  15. | 4 | 11 | 22 |
  16. | 5 | ttt | ddd |
  17. +----+------------+-----------+
  18. 5 rows in set (0.00 sec)

关于函数体

  • 函数体由合法的sql语句构成;
  • 函数体可以是简单的SELECT或INSERT语句;
  • 函数体如果为复合结构则使用BEGIN…END语句;
  • 复合结构可以包含声明,循环,控制结构;

删除函数:

  1. DROP FUNCTION [IF EXISTS] function_name

发表评论

表情:
评论列表 (有 0 条评论,353人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql定义函数

    1. 函数简介 mysql 5.0开始支持函数,函数是存在数据库中的一段sql集合,调用函数可以减少很多工作量, 减少数据在数据库和应用服务器上的传输,对于提高

    相关 MySQL 定义函数

    在使用 MySQL 的过程中,MySQL 自带的函数可能完成不了我们的业务需求,这时候就需要自定义函数。 自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一

    相关 MySQL定义函数

    > mysql中有许多计算函数,比如聚合函数SUM()、AVG()以及日期时间函数等等,我们可以直接使用;这里我们自定义函数主要用来封装计算,避免重复编写与语句美观。

    相关 MySQL定义函数

    函数 含义和存储过程基本一致 函数和存储过程的区别 1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程