博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql自定义函数
阅读量:4941 次
发布时间:2019-06-11

本文共 3181 字,大约阅读时间需要 10 分钟。

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 manual

corresponds to your MySQL server version for the right syntax to use near '
username) VALUES(username)' at line 4
mysql>
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 that
corresponds to your MySQL server version for the right syntax to use near 'test(
username) VALUES(username);
LAST_INSERT_ID()' at line 4

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.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

转载于:https://www.cnblogs.com/toudoubao/p/6640299.html

你可能感兴趣的文章
vue-cli目录结构及说明
查看>>
JS 数据类型转换
查看>>
WeQuant交易策略—RSI
查看>>
osgearth将视点绑定到一个节点上
查看>>
PHP 当前时间秒数+数值,然后再转换成时间。
查看>>
数据交互 axios 的使用
查看>>
bootloader,kernel,initrc
查看>>
Java中jshell脚本
查看>>
performSelector的方法
查看>>
redis
查看>>
BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线
查看>>
配置IIS
查看>>
单例模式详解
查看>>
电商项目(下)
查看>>
[NOIP2015] 子串
查看>>
NSSet和NSArray区别与方法总结
查看>>
Python列表 元组 字典 集合
查看>>
foreach遍历数组、数组的转置与方阵的迹
查看>>
Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
查看>>
HTML超文本标记语言(九)——表单输入类型
查看>>