MySQL自定义函数
一、什么是MYSQL自定义函数?
mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同。
二、自定义函数应该具备哪些条件?
我们先来回想一下内置函数是怎么使用的,首先函数一定要有一个名字,还有每个函数后面都有一个小括号,小括号里面写的内容我们称之为参数,当函数正常运行时,往往会得到一个信息,这个信息我们称之为返回值。所以我们可以发现,自定义函数应该具备两个条件:
(1)参数
(2)返回值
不仅是自定义函数需要这两个条件,我们可以发下系统自定义函数也需要这两个条件,当然参数并不是任何函数必备的条件,比如之前学的那个查看mysql版本的函数VERSION(),他并没有参数,但是有返回值,所以说参数和返回值之间并没有必然的联系。更详细点说,就是可以没有参数,但是会有返回值,当然也可以有两个或多个参数但是只有一个返回值,所以说函数一定有返回值,但是参数就不一定了。
函数可以返回任意类型的值,同样可以接收这些类型的参数,这句话就说明函数的返回值和参数可以为我们之前所学的任意一种数据类型,那么参数的数目有什么要求呢?在mysql当中,理论上讲,参数的数目不能超过1024个,我想这对于任何的函数都足够了,这就是对参数和返回值的一个简单的说明。
三、自定义函数的语法结构
CREATE FUNCTION function_name
RETURNS
{STRING|INTEGER|REAL|DECIMAL}
routine_body
那么如果我现在要创建一个函数,就需要通过CREATE FUNCTION 这个语句,后面加上函数名,RETURNS后面跟上返回值类型,routine_body指函数体。
四、关于函数体的几点说明
(1)函数体由合法的SQL语句构成;
(2)函数体可以是简单的SELECT或INSERT语句;
(3)函数体如果为复合结构则使用BEGIN....END语句;
(4)复合结构可以包含声明、循环、控制语句;
五、创建自定义函数
我们先来改一下编码方式为gbk,我们输入SET NAMES gbk;这里改变只影响我们客户端的编码方式,不影响服务器的编码方式,也就是说如果我在客户端写汉字的话,我们需要gbk,但是写入到数据库中,仍然是我们数据库当中默认的编码方式,因为我们的数据库是存在服务器端的。
1、我们先来创建一个无参的自定义函数,比如我们前面学过NOW()函数,我们输入SELECT NOW();
我们发现是这种形式,如果我们现在要改成汉字的形式,就是X年X月X日,类似这种,那么就需要用到DATA_FORMAT()这个函数,比如我们输入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秒') ;
OK,这个函数我们就创建成功了,当我们需要用的时候,我们就调用它,比如我们可以直接输入SELECT f1();
我们发现也能达到我们想要的结果,很明显这样调用起来就更方便了。这就是简单的给大家演示一个简单的无参的自定义函数。
2、我们也可以自定义有参的自定义函数,假设我们现在写一个可以计算两个数平均值的函数,比如我们输入
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
OK,这个函数创建成功,现在我们来调用一下,我们输入SELECT f2();
我们发现报错,因为我们没有传入参数,那我们就传入俩参数。
OK。我们发现就计算出来了平均值。当然我们也可以按照这种方式去定义3个参数或更多。
3、下面我们再来定义一个带有多个参数的函数,我们还以test表为例,我们先来看一下test表的结构,我们输入DESC test;
我们发现只有id和username字段,而且id字段还是自增的,现在我们想通过函数往数据表中插入数据,我们先来看一下表中的数据,我们输入SELECT * FROM test;
现在我们来定义一个函数来插入数据,我们输入CREATE FUNCTION adduser(username
VARCHAR(20))
RETURNS INT UNSIGNED
RETURN
INSERT test(username) VALUES(username);
这个时候,系统提示我们错误,为什么会出现这个错误呢?原因很简单,就是我们的分号被认为是mysql命令的结束,因为这里边根本就不存在int类型的返回值,这个时候我们就要通过DELIMITER来修改mysql默认的分隔符,我们输入DELIMITER//这两条斜线是什么意思呢,就是说以后你所有的命令都是通过//来结束的。
比如我们输入SELECT VERSION();这里我们输入分号就不管用,必须输入//(我们重新指定的两条斜线),这样就可以避免掉我们在上一条命令中再出现分号结束的情况,当然你也可以指定其他的结束符。
下面我们重新执行上面的命令,比如再加上LAST_INSERT_ID;我们再在后面加上//
我们发现又报错了,这是为什么呢?因为现在我们有两个语句要返回执行,那么我们就需要加上BEGIN。。。AND,构成一个聚合体,好,我们重新输入,(一二行不变),然后输入BEGIN
INSERT test(username) VALUES(username);
RETURN LAST_INSERT_ID();
END
//
OK,命令执行成,下面我们来调用我们刚刚自定义的函数,看是否能插入这个字段。
我们输入SELECT adduser('Hello');
//
ok,命令执行成功,字段也插入成功,说明这个自定义函数定义成功,下面我们再把这个结束符改为分号,我们输入DELIMITER ;
OK,我们再来插入一条,我们输入SELECT adduser('Tom');
OK,插入成功,下面我们来查看一下,SELECT * FROM test;
我们发现这就是我们想要的结果,OK,这就是最简单的自定义函数,实际上在开发过程中,用到系统内置的函数比较少,所以我们最好掌握一下标准的自定义函数。
六、删除函数
删除函数的语法结构
DROP FUNCTION [IF EXISTS] function_name
这个相对比较简单,大家自己练习一下就行。