MySQL_自定义函数

本文详细介绍了如何在MySQL中创建自定义函数,包括无参数和带参数的函数,并展示了如何使用流程控制语句,如IF、CASE、WHILE、LOOP和REPEAT,进行条件判断和循环操作。通过实例,解释了如何根据用户余额判断会员级别以及如何构建返回书名和库存信息的函数。

创建自定义函数

语法格式:

CREATE FUNCTION function_name([func_parameter])
RETURNS type
[characteristics … ] routine_body

  • function_name : 函数名称
  • func_parameter : 函数的参数列表(格式:参数名称 参数类型 param_name type
  • RETURNS type : 指定返回值的类型
  • Characteristics指定存储函数的特性,取值举例:
  • SQL SECURITY{DEFINER | INVOKER} : 指明谁有权限来执行
  • DEFINER : 表示只有定义者才能执行
  • INVOKER :表示拥有权限的调用者才可以执行,默认情况下,系统指定为DEFINER
  • COMMENT ‘string’ : 注释信息,可以用来描述存储函数
  • routine_body : 函数体
  • 函数体是由SQL代码构成
  • 函数体可以是简单的SQL语句,比如:简单的查询语句
  • 函数体如果为复合结构需要使用BEGIN … END语句
  • 复合结构可以包含声明、流程控制

创建无参的自定义函数
需求:创建一个返回系统日期的函数,日期格式为“xxxx年xx月xx日”
在这里插入图片描述

创建有参的自定义函数
*需求:创建一个函数,根据图书ID,返回书名和库存的字符串信息。格式为“书名—库存”
在这里插入图片描述

删除自定义函数

  • 删除存储过程函数和函数,可以使用DROP语句,语法为:

DROP FUNCTION [IF EXISTS] func_name;

在这里插入图片描述

流程控制的使用

  • 流程控制语句是用来根据条件控制语句的执行
  • 常用的流程控制语句:
  • IF条件判断语句
  • CASE条件判断语句
  • WHILE循环语句
  • LOOP循环语句
  • REPEAT循环语句

IF条件判断语句

  • IF语句包含多个条件判断,根据判断的结果为TRUE或FALSE执行相应的语句
  • 语法格式:

IF condition THEN
  …
[ELSEIF condition THEN]
  …
[ELSE]
  …
END IF;

需求:查询读者信息表,根据用户的余额判断用户的会员级别
1、根据身份证号查询用户的余额
2、当用户的余额大于等于500时为金牌会员
3、当用户的余额大于等于300时为高级会员
4、当用户的余额大于等于200时为普通会员
5、小于200元,不能借书,显示“非会员,余额不足”

在这里插入图片描述

CASE条件判断语句

  • 分支语句(另一种条件判断语句)
  • 该语句有两种语句格式:
  • 格式1:

CASE case_expr
  WHERE where_value1 THEN statement_list;
  [WHERE where_value2 THEN statement_list;]
  …
  [ELSE statement_list;]
END CASE;

在这里插入图片描述

  • 格式2:

CASE
  WHERE expr_condition THEN statement_list;
  [WHERE expr_condition THEN statement_list;]
  …
  [ELSE statement_list]
END CASE

在这里插入图片描述

WHILE循环语句

  • 判断循环条件,满足条件执行循环体,否则退出
  • 语法格式:

[while_label:] WHILE condition DO

END WHILE [while_label];

在这里插入图片描述

LOOP循环语句

  • 该循环没有内置循环条件,但可以通过leave语句退出循环
  • 语法格式:

[loop_label:] LOOP
  statement_list;
END LOOP [loop_label];

  • leave语句用来跳出循环,语法格式如下:
  • Leave label

在这里插入图片描述

REPEAT循环语句

  • 该语句执行一次循环体,之后判断condition条件是否为真,为真则退出循环,否则继续执行循环体
  • 语法格式:

[repeat_label:] REPEAT
  …
UNTIL expr_condition
EDN REPEAT [repeat_label];

在这里插入图片描述

MySQL 中创建自定义函数需要遵循一定的语法格式,并且需要注意一些环境配置问题,特别是在启用二进制日志记录的环境中。以下是一个完整的创建自定义函数的示例相关说明。 ### 创建自定义函数的基本语法 ```sql DELIMITER $$ CREATE FUNCTION function_name (param1 datatype, param2 datatype, ...) RETURNS return_datatype BEGIN -- 函数体 RETURN value; END $$ DELIMITER ; ``` ### 示例:创建一个简单的相加函数 ```sql DELIMITER $$ CREATE FUNCTION myfun3(ia INT, ib INT) RETURNS INT BEGIN RETURN ia + ib; END $$ DELIMITER ; ``` 上述代码定义了一个名为 `myfun3` 的函数,它接受两个整数参数 `ia` `ib`,并返回它们的[^1]。 ### 示例:创建一个通过学号获取学生信息的函数 ```sql DELIMITER $$ CREATE FUNCTION get_student_info(sid INT) RETURNS VARCHAR(255) BEGIN DECLARE student_info VARCHAR(255); SELECT CONCAT(name, ' - ', age, ' - ', gender) INTO student_info FROM students WHERE id = sid; RETURN student_info; END $$ DELIMITER ; ``` 此函数 `get_student_info` 接受一个学号 `sid` 作为参数,并返回学生的姓名、年龄性别信息[^2]。 ### 示例:创建一个判断学生成绩是否及格的函数 ```sql DELIMITER $$ CREATE FUNCTION is_pass(sid INT, course_id INT) RETURNS VARCHAR(10) BEGIN DECLARE score INT; DECLARE result VARCHAR(10); SELECT grade INTO score FROM grades WHERE student_id = sid AND course_id = course_id; IF score >= 60 THEN SET result = 'Pass'; ELSE SET result = 'Fail'; END IF; RETURN result; END $$ DELIMITER ; ``` 此函数 `is_pass` 接受学生学号 `sid` 课程编号 `course_id` 作为参数,并返回学生成绩是否及格的结果[^2]。 ### 注意事项 1. **二进制日志记录问题**:如果在创建函数时遇到报错信息 `This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled`,这是因为启用了主从复制并且函数没有声明为确定性的或不更改数据。可以通过设置 `log_bin_trust_function_creators = 1` 来解决这个问题[^3]。 2. **函数的返回值类型**:在创建函数时,必须明确指定返回值的类型,例如 `INT`, `VARCHAR`, `DECIMAL` 等。 3. **函数的使用**:创建完函数后,可以通过 `SELECT` 语句来调用函数,例如 `SELECT myfun3(5, 3);` 或 `SELECT get_student_info(1);`。 ### 查看删除函数 - **查看所有自定义函数**: ```sql SHOW FUNCTION STATUS LIKE 'myfun3'; ``` - **查看函数创建语句**: ```sql SHOW CREATE FUNCTION myfun3; ``` - **删除函数**: ```sql DROP FUNCTION myfun3; ``` ### 示例:使用函数查询汇率 ```sql DELIMITER $$ CREATE FUNCTION get_rate(idate DATE, CURRENCY VARCHAR(32)) RETURNS DECIMAL(21,6) BEGIN DECLARE res DECIMAL(21,6) DEFAULT 1; SELECT rate INTO res FROM t_exchangerate WHERE ratedate = idate AND CURRENCYID = CURRENCY; RETURN res; END $$ DELIMITER ; ``` 此函数 `get_rate` 接受日期 `idate` 货币代码 `CURRENCY` 作为参数,并返回相应的汇率[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值