MySQL 自定义函数一文读懂

Posted 在奋斗的大道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 自定义函数一文读懂相关的知识,希望对你有一定的参考价值。

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名称不统一 + 兼容不同数据库。

以上是关于MySQL 自定义函数一文读懂的主要内容,如果未能解决你的问题,请参考以下文章

MySQL8 一文读懂存储过程

一文读懂Python 高阶函数

一文带你读懂Dockerfile

一文读懂深克隆与浅克隆的关系

一文读懂 JAVA 异常处理

区块链词典 | 一文读懂哈希哈希函数和哈希算法