我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔在本文中将要描述如何定义和使用mysql数据库专用的函数。这些函数定义后,是和数据表同级别的存在。下次链接数据库之后,还是可以继续使用的。

苏南大叔:mysql,如何定义和使用数据库专用函数function? - mysql-function
mysql,如何定义和使用数据库专用函数function?(图8-1)

大家好,这里是苏南大叔的“平行空间笔记本”博客,主要记录苏南大叔的代码编程所学所想。本文描述mysql数据库专用自定义函数的创建和使用方式。测试环境:win10mysql@5.7.26

背景文章

如果您使用mysql官方客户端在命令行下执行相关语句的话,那么,您可能会用到分隔符delimiter的用法。参考文章:

切换分隔符为$

delimiter $

恢复分隔符为分号的方法为:

delimiter ;

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 切换分隔符
mysql,如何定义和使用数据库专用函数function?(图8-2)

如果使用的是第三方客户端,这个切换分隔符的操作是大概率不用的。强制输入的话,也极大概率会被识别成错误。
官方客户端里面,只有输入这个分隔符,才会执行相关语句。而可视化的非官方客户端里面,因为是先输入整体语句,再通过操作按钮才会执行全部语句,所以并没有这个困扰!

数据集

这里还是采用前几篇文章里面的数据集:

DROP TABLE IF EXISTS `posts`;
CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `posts` VALUES (1,1,'1-苏南大叔的文章1'),(2,1,'1-苏南大叔的文章2'),(3,2,'2-苏南大哥的文章'),(4,9,'9-神秘人的文章');

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES (1,'1-苏南大叔'),(2,'2-苏南大哥'),(3,'3-苏南兄弟');

创建自定义函数和调用

语法如下:

create function 函数名(参数名1 参数类型1,参数名2 参数类型2,...) returns 返回类型
begin 
  函数体
End
注意:语法中是returns,多个s字样。

这个自定义函数,必须有返回值有返回语句,返回个空字符串也行。但是必须要返回个值,否则不符合语法。
报错信息如下:

no RETURN found

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 错误信息一
mysql,如何定义和使用数据库专用函数function?(图8-3)

自定义函数,有且只有一个返回值。

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 错误信息二
mysql,如何定义和使用数据库专用函数function?(图8-4)

调用方式

调用的方式是:

select 函数名(参数)

测试用例一(没参数)

下面的测试用例里面,在第三方客户端里执行,所以没有考虑分隔符切换的问题。

求当前共有几名用户:

create function count_users() returns int
begin
    declare c int default 0;
    select count(*) into c from users;
    return c;
End

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 函数定义及调用
mysql,如何定义和使用数据库专用函数function?(图8-5)

select count_users()
select count_users() as cnt

测试用例二(传递参数)

求用户名对应的用户id:

create function get_uid(userName VARCHAR(20)) returns int
begin
    set @uid=0;
    select id into @uid from users where name = userName;
    return @uid;
End
select get_uid("1-苏南大叔") as a,get_uid("苏南大叔") as b;

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 定义和运行方式2
mysql,如何定义和使用数据库专用函数function?(图8-6)

查看定义

show create function 函数名

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 查看函数定义1
mysql,如何定义和使用数据库专用函数function?(图8-7)

可以看到对get_uid的函数体查询中,是多了一些字样(DEFINER=root@localhost`)的。

CREATE DEFINER=`root`@`localhost` FUNCTION `get_uid`(userName VARCHAR(20)) RETURNS int(11)
begin
set @uid=0;
select id into @uid from users where name = userName;
return @uid;
End;

苏南大叔:mysql,如何定义和使用数据库专用函数function? - 函数体定义查询
mysql,如何定义和使用数据库专用函数function?(图8-8)

删除定义

drop function 函数名

测试用例语句是:

drop function get_uid

相关文章

总结

更多苏南大叔写的mysql相关文章,请点击下面的链接查看:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql