MySQL 自定义函数一文读懂

news2024/10/7 6:48:37

MySQL函数

含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。

存储过程与函数区别:

存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新。
函数:有且仅有1 个返回,适合做处理数据后返回一个结果。

MySQL 函数语法

语法结构:

CREATE FUNCTION 函数名(参数列表) RETURNS 返回值类型
BEGIN
	函数体
END

温馨提示:

  • 参数列表 包含两部分:参数名 参数类型
  • 函数体:肯定会有return语句,如果没有会报错
  • 函数体中仅有一句话,则可以省略begin end

MySQL 函数实例

第一种情况:有请求参数有返回值

功能需求:用户调用getScore 函数输入分数,返回成绩登记:A ->B->C->D

create function  getScore(score int) returns varchar(64)
begin
    -- 定义判断标识
    declare target int default 0;
    -- 定义成绩Message
    declare message varchar(64);
    

    -- 判断分数是否为空
    select isNull(score) into target;
    if target = 0 then:
        set message = '请输入正确分数';
        return message;
    then if;
    
    select score <= 60 into target;
    if target = 1 then:
        set message =  '得分:D';
        return message;
    then if;
    
    select score > 60 and score <= 70 into target;
    if target = 1 then:
        set message =  '得分:C';
        return message;
    then if;
    
    select score > 70 and score <= 80 into target;
    if target = 1 then:
        set message =  '得分:B';
        return message;
    then if;

    select score > 80 and score <= 90 into target;
    if target = 1 then:
        set message =  '得分:A';
        return message;
    then if;

    select score > 90 and score <= 100 into target;
    if target = 1 then:
        set message =  '得分:A+';
        return message;
    then if;

end;

第二种情况:无请求参数有返回值

功能需求:获取房屋总数

create function getHouseCount() returns int
begin
    -- 定义总数变量
    declare counts  int default 0;
    -- 查询房屋总数
    select count(*) into counts  from base_house;
    -- 返回房屋总数
    return counts;
end

查看 MySQL 函数

语法格式:

SHOW CREATE FUNCTION 函数名称;

实战:

查看getScore 函数

show create function getScore;

查看getHouseCount 函数

show create function getHouseCount;

删除 MySQL 函数

语法格式:

DROP FUNCTION 函数名称;

实战:

drop function getScore

完整案例

功能要求:实现传入两个float,返回二者之和。

CREATE FUNCTION test_add(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
	DECLARE SUM FLOAT DEFAULT 0;
	SET SUM=num1+num2;
	RETURN SUM;
END $

调用test_add 函数

select test_add(1, 2);

MySQL 函数 拓展

最近在工作中遇到一个有趣的问题,把它作为MySQL函数 拓展功能点,在本章节进行讲解说明。

需求变更:在负责的商品房管理系统中,新增商品房检测指标的功能需求。由于涉及到基础平台的流程数据,所以向平台管理员申请指定数据库连接账户的跨库权限。为实现商品房检测指令功能,我使用了MySQL的存储过程 实现数据的搜集功能,但把相关实现方式跟基础平台的领导汇报反馈时。领导直接pass 了该方案。给出的理由是:用户实施现场的数据库sechemal名称不统一,用户现场的数据库不一定是MySQL 数据库可能是其他国产或Oracle 数据库等。

初步解决办法:使用Java 定时任务调用Java 服务, 最后在调用视图View。

遇到的问题:MySQL 视图仅仅是一种虚拟存在的表,是一个逻辑表,本身不包含数据。仅仅是一个select 语句查询集合,且不接受参数。

针对视图无法传递参数,我们可以通过MySQL 视图中调用MySQL自定义函数,实现视图入参。

第一步:创建ids 函数,主要返回传入商品房id。

create function ids() returns VARCHAR(255) DETERMINISTIC NO SQL return @ids;

第二步:创建getHouse 视图,并在视图中调用ids 函数。

CREATE VIEW getHouse AS SELECT * FROM base_house WHERE id=ids()

 第三步:设置ids 函数值,并调用getHouse 视图。

set @ids='1';
select * from getHouse;

 

如果传递房屋数据中不存在的Id值。

set @ids='2';
select * from getHouse;

 

 温馨提示: 视图中调用函数实现视图传参功能,最大的问题是:函数无法接受返回数组/集合参数。

针对上述的结果,最终的解决方案为:Java 动态Schemal 方式,屏蔽用户现场sechemal名称不统一 + 兼容不同数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内部群炸锅了,同事又删库了

事件起因 我们的系统中有数据导入的功能&#xff0c;可以把特定的格式的excel数据导入到系统中来 由于客户电脑的文件比较多&#xff0c;很多文件的名字也比较相近&#xff0c;客户在导入excel时选错了文件 这个错误的excel文件的格式恰好能被系统解析&#xff0c;客户也没及…

【专栏】实践篇08| All in docker!动手搭建Redis集群

关注公众号&#xff1a;【离心计划】&#xff0c;一起逃离舒适圈 Redis专栏合集 【专栏】01| Redis夜的第一章 【专栏】基础篇02| Redis 旁路缓存的价值 【专栏】基础篇03| Redis 花样的数据结构 【专栏】基础篇04| Redis 该怎么保证数据不丢失&#xff08;上&#xff09…

(附源码)Spring Boot的网上作业管理系统 毕业设计 612317

基于Spring Boot的网上作业管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现…

【正点原子FPGA连载】第三十三章OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十三章OV564…

02-Neo4j-CQL

02-Neo4j-CQL&#xff1a; 1、CQL简介 CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL&#xff0c;Neo4j具有CQL作为查询语言。 Neo4j CQL 它是Neo4j图形数据库的查询语言。它是一种声明性模式匹配语言它遵循SQL语法。它的语法是非常简单且人性化、可读的格式。 …

具有成本效益的深度信任网络的智能LEACH的多级动态优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 能量利用率是能量受限无线传感器网络&#xff08;WSN&#xff09;的关键属性&#xff0c;它直接影响网络的寿命。LEACH&#x…

C++入门篇之 注释语法什么写

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

python+requests接口自动化测试框架实例详解教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

windows下Qt 5的安装与编译打包

环境与版本 操作系统&#xff1a;windows 10 Qt版本&#xff1a;5.14.2&#xff0c;最后一个有独立安装包的版本&#xff0c;下载地址&#xff1a;archive/qt/5.14/5.14.2 IDE&#xff1a;自带的qt-creator 4.11.1&#xff0c;也可以自行下载其他版本4.14.2&#xff0c;下载…

Mybatis实现增删改查

准备工作&#xff1a;建立项目&#xff0c;连接数据库MySQL&#xff0c;安装Mybatix插件 数据库代码准备&#xff1a; -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,…

itop3568开发板旋转uboot logo和内核logo

修改设备树 rk_android11.0_sdk/kernel/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi 文件。如果配套的屏幕是 LVDS 7 寸屏幕或者 LVDS10.1 寸 1024*600 屏幕或者 LVDS10.1 寸 1280*800 屏幕&#xff0c;修改如下所示。 &route_lvds{ status "okay"; …

使用Postman+JMeter进行简单的接口测试

以前每次学习接口测试都是百度&#xff0c;查看相关人员的实战经验&#xff0c;没有结合自己公司项目接口真正具体情况。 这里简单分享一下公司项目Web平台的一个查询接口&#xff0c;我会使用2种工具Postman和JMeter如何对同一个接口做调试。 准备工作 首先&#xff0c;登录公…

GATK Germline_SNP_INDEL_2.0 分析遗传病(耳聋)

GATK Germline_SNP_INDEL_2.0 分析遗传病&#xff08;耳聋&#xff09; 一、本文是Gatk Germline spns-indels Pipeline 分析遗传病(耳聋)的升级版&#xff0c;目的是提供开箱即用的分析流程&#xff0c;尽可能简化部署和迁移。 更新内容如下&#xff1a; 人类参考基因组以及…

RTSP 媒体协议流的录制方案及其覆盖策略详解

前言 在安防和监控领域&#xff0c;RTSP 媒体协议流有很广泛的使用。本文将介绍一种针对 RTSP 媒体流的录制方案及其相应的覆盖策略。据我所知&#xff0c;声网的实时录制功能支持三种模式&#xff0c;分别是云端录制、本地服务端录制和页面录制&#xff0c;今天我们介绍的录制…

[基因遗传算法]进阶之六:VRP的进阶经典问题的解码如何写

文章目录一、CVRP二、MDCVRP2.1 解的编码分析2.2 代码2.3 分割展示三、VRPTW四、MDVRPTW4. 1 解的编码分析4.2 解的代码4.3 结果展示4. 4 MDVRPTW的计算适应度4.5 MDVRPTWd的结果展示图一、CVRP 见博文《[基因遗传算法]进阶之三:实践CVRP》 二、MDCVRP 参考资料:《Python实现…

Qt的场景图Scene Graph

叫场景树更合适&#xff0c;本质不是图。QML场景中的Qt Quick项目将填充QSGNode实例树。 场景图是Qt Quick 2.0引入的&#xff0c;建立在要绘制的内容是已知的基础上。所有QML项目均使用场景图进行渲染&#xff0c;场景图的默认实现是与OpenGL紧密相关的低级高性能渲染堆栈。 …

谈谈前端性能优化-面试版

前言 当我们去面试的时候&#xff0c;很大概率会被面试官问这么一个问题&#xff1a;你有尝试过对项目做性能优化吗&#xff1f;或者你了解哪些性能优化的方法&#xff1f;听到这个问题的你可能是这样的&#xff1a; 似曾相识但又说不清楚&#xff0c;往往只能零散地说出那么几…

Go string原理简析

引入 当查看string类型的变量所占的空间大小时&#xff0c;会发现是16字节&#xff08;64位机器&#xff09;。 str : "hello"fmt.Println(unsafe.Sizeof(str)) // 16也许你会好奇&#xff0c;为什么是16字节&#xff0c;它的底层存储模型是什么样子的。 源码分析 …

焦脱镁叶绿酸-a修饰量子点/荧光/药物/小分子抑制剂/上转换纳米颗粒/树枝状聚合物

小编在这里为大家分享的科研内容是焦脱镁叶绿酸-a修饰量子点/荧光/药物/小分子抑制剂/上转换纳米颗粒/树枝状聚合物的相关研究&#xff0c;来看&#xff01; 焦脱镁叶绿酸-a简介&#xff1a; 焦脱镁叶绿素-a是产物叶绿素a通过脱甲氧羰基、去植物醇、去Mg后的产物。该类物质具有…

day19【代码随想录】删除字符串中的所有相邻重复项、逆波兰表达式求值、滑动窗口最大值、前 K 个高频元素、数组中的第K个最大元素

文章目录前言一、删除字符串中的所有相邻重复项&#xff08;力扣047&#xff09;二、逆波兰表达式求值&#xff08;力扣150&#xff09;三、滑动窗口最大值&#xff08;力扣239&#xff09;四、前 K 个高频元素&#xff08;力扣347&#xff09;五、数组中的第K个最大元素&#…