MySQL自定义函数(四十六)
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
这个相对比较简单,大家自己练习一下就行。
MySQL自定义函数(四十六)的更多相关文章
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- NeHe OpenGL教程 第四十六课:全屏反走样
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...
- 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么
第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...
- mysql 自定义函数
原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...
- 四十六、android中的Bitmap
四十六.android中的Bitmap: http://www.cnblogs.com/linjiqin/archive/2011/12/28/2304940.html 四十七.实现调用Android ...
- mysql自定义函数并在存储过程中调用,生成一千万条数据
mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...
- MySQL 自定义函数CREATE FUNCTION实例
分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...
- “全栈2019”Java第四十六章:继承与字段
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 批量删除harbor中的镜像
一 说明 这个是我第一篇博客,所以我想放上原创的东西,尽管我一直都很担心自己写得太low,但是总要学会尝试,学会改变自己,相信自己.在写这个脚本时,由于我接触LInux不是很多,能力有限,仅仅是为了让 ...
- 小巧的ssh客户端
所用到的知识点 os 模块 文件操作 循环 字符串操作 字典 #!/use/bin/python #coding=utf8 import os print '\033[1;32;40m welcome ...
- Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
- Mysql学习总结(26)——MySQL子查询
mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...
- 国庆 day 7 上午
思路:模拟,set记录一下. #include<set> #include<cstdio> #include<cstring> #include<iostre ...
- SCN 时间戳的相互转换
SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...
- glm编译错误问题解决 formal parameter with __declspec(align('16')) won't be aligned
參考:http://stackoverflow.com/questions/25300116/directxxmmatrix-error-c2719-declspecalign16-wont-be-a ...
- java操作文件创建、删除
java操作文件创建.删除: package test; import java.io.File; import java.io.IOException; import org.slf4j.Logge ...
- jquery的append/prepend和after/before有什么区别呢?
append <p> <span class="s1">s1</span> </p> <script> $(" ...
- ASP.NET Identity 角色管理(Roles)
当我们使用ASP.NET 4.5创建模板项目时,会发现模板只提供了ApplicationUserManager用于用户的登录注册.修改.设置等,而没有提供与用户角色相关的代码,对此就需要我们自己手动的 ...