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