(7)Mysql自定义函数

来源:互联网 发布:吃鸡买号还是软件 编辑:程序博客网 时间:2024/06/15 14:34

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就可以了。

原创粉丝点击