自定义函数
# 工资表
CREATE TABLE `test` (
`id` int NOT NULL auto_increment primary key,
`salary` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
# 插入数据
insert into test(salary) values(100);
insert into test(salary) values(200);
insert into test(salary) values(200);
insert into test(salary) values(300);
# 查询 工资第 N 的 function
CREATE FUNCTION getSecondSalary(N INT) RETURNS INT
BEGIN
DECLARE st INT;
SET st=N-1;
RETURN(SELECT DISTINCT salary FROM test ORDER BY test.salary DESC LIMIT st,1);
END
# 查询 工资排名第二的数据
SELECT getSecondSalary(2);
控制台错误
> 1418 - This function has none of DETERMINISTIC,
NO SQL,or READS SQL DATA in its declaration and binary
logging is enabled (you *might* want to use the less safe
log_bin_trust_function_creators variable)
> 时间: 0 秒
翻译:
在自定义函数里面,只有 DETERMINISTIC
, NO SQL
和 READS SQL DATA
被支持。如果我们开启了 bin-log
, 我们就必须为我们的函数指定一个参数。
原因分析
MySQL开启bin-log
后,调用存储过程、函数、触发器时,会出现错误号为1418的错误。
解决
我们开启了bin-log, 我们就必须指定我们的函数:
DETERMINISTIC
不确定的;NO SQL
没有SQl语句,当然也不会修改数据;READS SQL DATA
只是读取数据,当然也不会修改数据;MODIFIES SQL DATA
要修改数据;CONTAINS SQL
包含了SQL语句;
由于,我自定义的函数,只涉及到数据的查询,所以,使用 READS SQL DATA
指定
CREATE FUNCTION getSecondSalary(N INT) RETURNS INT
READS SQL DATA
BEGIN
DECLARE st INT;
SET st=N-1;
RETURN(SELECT DISTINCT salary FROM test ORDER BY test.salary DESC LIMIT st,1);
END
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69699.html