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第 ...
随机推荐
- Linux Shell脚本编程-信号捕获
bash编程的信号捕获: kill -l 显示当前系统可用信号(trap -l) 获取帮助:man 7 single 常用信号: 1) SIGHUP 无须重启进程而让其重读配置文件 2) SI ...
- python学习笔记:第八天
文件操作: 1.文件基本操作方法: 1.打开文件2.文件操作3.文件关闭三种基本的操作模式 r(只可读) w(只可写) a(追加) 2.读文件: # f = open('静夜思','r',encodi ...
- caioj 1154 同余方程(模版)
求x的最小正整数解,使得ax=b(mod m) 那么显然ax - b = m * y ax - my = b 那么就套入Ax+By = K的不定方程中,然后用exgcd求解即可 但这道题求最大正整数解 ...
- 对于树的序列化,用了stream,很好
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/?tab=Description 下面这个解法里面的C++部分很 ...
- MySQl Study学习之--MySQl二进制日志管理
MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log) a.它包括的内容及作用例如以下: 包括了全部更新了数据或者已经潜在更新了数据(比方没 ...
- js中如何获取对象的长度和名称
js如何获取对象长度和名称 一.总结 一句话总结:对象的长度不能用.length获取,用js原生的Object.keys可以获取到 var obj = {'name' : 'Tom' , 'sex' ...
- The python programing language
Python is an example of high-level language. As you might infer from the name “high-level language”, ...
- 如何配置MySQL?(三)
要进行mysql配置,首先要找到mysql的配置向导文件,这个配置向导文件就在我们安装目录下的一个bin的子目录下. 刚才我们是选择典型安装MySQL,一般windows是默认存储在C:\Progra ...
- Spring Boot AutoConfiguration注解@ConditionalXXXX之前生今世
1.注解@Conditional的定义 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHO ...
- Chromium Graphics: Video Playback and Compositor
Video Playback and Compositor Authors: jamesr@chromium.org, danakj@chromium.org The Chromium composi ...