任务七 存储函数
知识点
1. 什么是存储函数?与MySQL内部函数有什么区别?
答:MySQL支持自定义函数(存储函数),定义好之后,调用方式与调用MySQL预定义的系统函数一样。用户自己定义的存储函数与MySQL内部函数是一个性质的,区别在于:存储函数是用户自己定义的,而内部函数是MySQL的开发者定义的。
2. 存储函数与存储过程有什么区别?
答:存储函数与存储过程的主要区别:
- 参数类型:存储函数默认IN类型参数,不能设置OUT和INOUT参数;存储过程支持IN、OUT、INOUT三种
- 返回值:存储函数头部必须用RETURNS声明返回值类型,函数体内通过RETURN语句返回一个值;存储过程不要求返回值
- 调用方式:存储函数使用SELECT调用(如
SELECT 函数名(参数));存储过程使用CALL调用 - 使用场景:存储函数适合计算并返回单个值;存储过程适合执行复杂操作
3. CREATE FUNCTION语句的语法格式是什么?
答:CREATE FUNCTION语句的语法格式:
CREATE FUNCTION <函数名>([<参数名> 数据类型[, ...]])
RETURNS <返回类型>
BEGIN
<过程体>
END;
注意:
- 存储函数默认IN类型参数,不能设置OUT和INOUT类型参数
- RETURNS子句声明返回值类型只能在存储函数中使用
- 一个存储函数必须包含一个RETURNS语句
- 过程体中必须包含RETURN语句返回值
4. 如何创建无参数的存储函数?请举例说明。
答:创建无参数存储函数示例,查询学号为"20220101"的学生地址:
CREATE FUNCTION add_fun()
RETURNS VARCHAR(255)
BEGIN
RETURN(
SELECT Address FROM student WHERE StuID = '20220101'
);
END;
该函数无参数,返回类型为VARCHAR(255),通过RETURN返回查询结果。
5. 如何创建带参数的存储函数?请举例说明。
答:创建带参数存储函数示例,查询指定年龄的学生数量:
CREATE FUNCTION agecount_fun(age INT)
RETURNS INT
BEGIN
RETURN(
SELECT COUNT(*) FROM student WHERE Stuage = age
);
END;
该函数接收一个INT类型的age参数,返回INT类型的学生数量。
6. 如何调用存储函数?
答:存储函数的调用方法与MySQL内部函数一样,使用SELECT语句调用,语法格式:
SELECT <函数名(实参列表)>;
例如:
SELECT add_fun();:调用无参数的存储函数SELECT agecount_fun(16);:调用带参数的存储函数,查询年龄为16岁的学生数量
7. 查看存储函数有哪几种方式?
答:查看存储函数有三种方式:
SHOW FUNCTION STATUS [LIKE '<函数名>'];:查看存储函数的状态SHOW CREATE FUNCTION <函数名>;:查看存储函数的定义(创建语句)SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='函数名';:从信息模式表中查看
8. SHOW FUNCTION STATUS的作用是什么?
答:SHOW FUNCTION STATUS; 用于查看系统中所有存储函数的状态信息,输出包含Db(数据库名)、Name(函数名)、Type(类型)、Definer(定义者)、Modified(修改时间)、Created(创建时间)、Security_type(安全类型)等字段。
可以使用LIKE过滤:SHOW FUNCTION STATUS LIKE 'add_fun'; 查看特定名称的存储函数。
9. SHOW CREATE FUNCTION的作用是什么?
答:SHOW CREATE FUNCTION <函数名>; 用于查看指定存储函数的完整创建语句(定义文本),包括CREATE FUNCTION语句的完整定义、参数列表、RETURNS返回类型、过程体中的所有SQL语句等。
10. information_schema.Routines表的作用是什么?
答:MySQL中的存储过程和存储函数的信息都存储在 information_schema.Routines 表中,可以通过查询该表来获取存储函数的详细信息:
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='add_fun';
该表包含SPECIFIC_NAME、ROUTINE_SCHEMA、ROUTINE_NAME、ROUTINE_TYPE(FUNCTION或PROCEDURE)、DATA_TYPE等字段。
11. 如何修改存储函数的特性?
答:使用ALTER FUNCTION语句修改存储函数的特性,语法格式:
ALTER FUNCTION <函数名> [characteristic ...];
characteristic参数与存储过程相同,包括:CONTAINS SQL、NO SQL、READS SQL DATA、MODIFIES SQL DATA、SQL SECURITY {DEFINER|INVOKER}、COMMENT 'string'。
注意:ALTER FUNCTION只能修改特性,不能修改函数体。如需修改函数体,需要先删除再重新创建。
12. 如何删除存储函数?
答:使用DROP FUNCTION语句删除存储函数,语法格式:
DROP FUNCTION [IF EXISTS] <函数名>;
例如:DROP FUNCTION IF EXISTS add_fun; 删除add_fun存储函数。使用IF EXISTS可以避免函数不存在时报错。
13. 存储函数的完整管理流程是什么?
答:存储函数的完整管理流程:
- 创建:
CREATE FUNCTION 函数名(参数) RETURNS 类型 BEGIN ... RETURN(值); END; - 调用:
SELECT 函数名(实参); - 查看:
SHOW FUNCTION STATUS;或SHOW CREATE FUNCTION 函数名; - 修改特性:
ALTER FUNCTION 函数名 characteristic; - 删除:
DROP FUNCTION [IF EXISTS] 函数名;
14. 存储函数修改特性的示例是什么?
答:修改存储函数add_fun的特性,将读写权限改为READS SQL DATA,并加上注释信息:
ALTER FUNCTION add_fun
READS SQL DATA
COMMENT 'FIND ADDRESS';
修改后可以通过 SHOW CREATE FUNCTION add_fun; 查看修改后的结果,会显示更新后的特性和注释信息。