前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql自定义函数详解_mysql自定义函数详解

mysql自定义函数详解_mysql自定义函数详解

作者头像
全栈程序员站长
发布2022-10-04 20:08:47
2K0
发布2022-10-04 20:08:47
举报

大家好,又见面了,我是你们的朋友全栈君。

需求:对于数据库中的记录,如果有两条连续的数据的value字段的值相同,则发邮件通知相关人员。

需求分析:告警系统里面的告警检查是通过SQL来进行的,一般的SQL实现不了此功能,因此,这里可以通过函数的方式来实现。

具体实现如下:

1、数据表准备:tb_config_record。新建数据表脚本如下:

create table tb_config_record (id int ,status varchar(20), value varchar(20), updated_at datetime, updated_by varchar(20), created_at datetime, created_by varchar(20)) ;

2、数据准备。脚本如下:

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(1,’SUCCESS’,’0′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(2,’SUCCESS’,’1′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(3,’SUCCESS’,’2′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(4,’SUCCESS’,’3′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(5,’SUCCESS’,’4′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(6,’SUCCESS’,’6′,now(),’SYS’,now(),’SYS’);

insert into tb_config_record (id , status ,value ,updated_at ,updated_by , created_at , created_by) values(7,’SUCCESS’,’6′,now(),’SYS’,now(),’SYS’);

3、函数编写。

delimiter //

create function has_serial_status() returns integer

begin

declare val varchar(20) ;

declare tmp varchar(20) default null ;

declare result integer default 0 ;

declare value_serials_cursor cursor for select value from tb_config_record where status = ‘SUCCESS’ order by id asc ;

declare exit handler for not found return result;

open value_serials_cursor ;

loop_serials : loop

fetch value_serials_cursor into val ;

if val = tmp then

set result = 1 ;

leave loop_serials ;

else

set tmp = val ;

end if;

end loop ;

close value_serials_cursor ;

return result ;

end //

delimiter ;

4、执行结果

40417215954895d792098d316961e212.png
40417215954895d792098d316961e212.png

删除id=7的记录后,重新执行函数

cd1598a36649bbabf2316b429c6b4d64.png
cd1598a36649bbabf2316b429c6b4d64.png

总结:

函数按照预期的方式运行,得到正确的结果。具体操作过程中遇见以下困难:

1、函数编写时,每行都要顶格写,不然就会出现如下错误

6f4a15cd1407bad6dccf917a623287e8.png
6f4a15cd1407bad6dccf917a623287e8.png

运行错误:

b7001ea5c6d7a63999a92f209db0b7a9.png
b7001ea5c6d7a63999a92f209db0b7a9.png

2、需要在函数语句中添加语句:declare exit handler for not found return result;

否则出现如下错误:

52b29197313bb6bb53ac4980c59bd41d.png
52b29197313bb6bb53ac4980c59bd41d.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196090.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月7日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档