(7)Mysql自定义函数
2017-08-04 11:54
239 查看
1.回顾以及自定义函数的简介
上一节课主要讲了内置函数,对于系统函数,完成我们常规的操作就足够了,但是有些情况下不能满足则需要使用自定义函数。自定义函数,用户自定义函数(user-defined function,UDF)是一种对Mysql扩展的途径,其用法与内置函数相同。我们这里回忆一下内置函数是如何使用的?首先它要有个名字,第二函数我们在调用的时候都可以发现后面带有了一个小括号,小括号当中所写的数据我们称之为参数,当这个函数正常运行以后往往会得到一个信息,而这个信息我们则称之为返回值。
1.自定义函数的两个必要条件
a.参数
b.返回值
不仅是自定义函数存在这两个必要条件,我们之前学到的系统函数也存在这两个必要的条件,当然参数并不是我们任何一个函数所必备的要件,例如SELECT VERSION(),就是没有参数但是有返回值。
函数的参数与返回值之间,没有必然的联系,我们某一个函数可以不存在参数,但是有返回值。我们在实际的应用当中,不存在某个函数没有返回值的情况,所有的函数都有返回值但不一定有参数。
函数可以返回任意类型的值,同样可以接收这些类型的参数。通过这句话我们可以发现,函数的参数以及返回值可以为我们前面所学到的任意数据类型。
如果说要创建函数,函数的参数理论上来说可以到达多少呢?Mysql当中规定,参数数量理论上来讲不能超过1024个,这对于我们常规的开发,基本上足够了。
2.创建自定义函数
RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body
RETURNS 指的是返回值的类型,routine_body指的是当前的函数体
3.关于函数体–routine_body
(1)函数体由合法的SQL语法构成;
(2)函数体可以是简单的SELECT或INSERT语句;
(3)函数体如果为复合结构则使用BEGIN…END语句;
(4)复合结构可以包括声明,循环,控制结构。
2.Mysql创建不带参数的自定义函数
SET NAMES gbk;它只影响你客户端的编码,不会影响你服务器端的编码。
SELECT NOW()返回的是时间,如果我们不想用默认的格式来显示时间,而是用中文的格式,就需要使用DATE_FORMAT()方法来实现,对NOW进行格式化,
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'),这样返回的时间就是汉字格式了,我们发现每次这么写的话我们会很麻烦,那么可不可以把这个过程封装成一个自定义函数呢?答案是肯定的。在这里我们发现我们并不要一个参数,我们可以这样写:
CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
此时再调用新的函数时结果一致,中文显示,这就是我们当前的不带有参数的自定义函数。
3.Mysql创建带有参数的自定义函数
我们也可以创建带有函数的参数,假设我们现在写一个函数,它可以计算两个数的平均值CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) RETURNS FLOAT(10,2) UNSIGNED RETURN (num1+num2)/2;
4.Mysql创建具有复合结构函数体的自定义函数
DESC 表名;输出其描述信息,DESC是描述的缩写,小写desc是降序的意思。这里我们的新函数想实现的是,往数据表里插入一条记录并且返回该记录所属的id值,先按照以前的想法写出来,看看会提示什么:
CREATE FUNCTION adduser(username VARCHAR(20)) RETURNS SMALLINT UNSIGNED RETURN INSERT t6(username) VALUES (username);
回车之后报错,因为分号代表着结束,而查看这个函数可以发现我们根本没有返回id的值,也就是没有smallint类型的结果输出。
这时我们要用DELIMITER 修改斜线
DELIMITER //,这两条斜线指的是什么意思,以后你所有的命令都需要用两条斜线来结束,这样就能避免刚才的分号被判断为函数结尾了。此时我们就可以修改我们之前的函数了,由于之前是没有SMALLINT类型的值结尾,我们加上
LAST_INSERT_ID();//,结果还是报错。因为我们是需要两个语句来执行,此时就需要添加BEGIN…END语句,构成一个聚合体。
最终的完成体函数:
CREATE FUNCTION adduser(username VARCHAR(20)) RETURNS SMALLINT UNSIGNED BEGIN INSERT t6(username) VALUES (username); RETURN LAST_INSERT_ID(); END //
此时测验正常使用。再用DELIMITER;修改回原来的分号结尾,依旧可以正常使用。这些就是我们最简单的自定义函数,在这其中可以包含声明,循环以及流程控制,关于什么是循环和流程控制我们在之后会讲。实际的开发当中我们用自定义函数实际应用的并不是特别多,当然我们只需要了解如何实现标准的自定义函数就可以了。最后如果我们想把这些函数删除掉,我们就可以使用
DROP FUNCTION [IF EXISTS] function_name就可以了。
相关文章推荐
- mysql自定义函数
- mysql中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- mysql的自定义的函数和存储过程与触发器
- MySQL 创建自定义函数(1)
- linux下mysql扩展,自定义函数实现(…
- Mysql自定义函数之------------This function has none of DETERMINISTIC, NO SQL解决办法
- mysql 自定义排序函数field()
- mysql里创建自定义函数---将某字段以逗号分割并取出第一个数据
- MySQL自定义排序函数FIELD()
- Mysql Query Browser下创建存储过程和自定义函数
- MySQL自定义函数
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制--及其相关案例
- Mysql中实现提取字符串中的数字的自定义函数分享
- MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)
- mysql自定义函数篇
- MySQL自定义函数——流程控制
- MySQL优化之——自定义存储过程和函数
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制
- MySQL自定义函数计算年龄