Mysql中自定义函数的创建和执行方法是什么

发布时间:2023-03-10 10:37:05 作者:iii
来源:亿速云 阅读:205

本文小编为大家详细介绍“Mysql中自定义函数的创建和执行方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql中自定义函数的创建和执行方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Mysql自定义函数的创建和执行

假设students表中包含id和name两个字段,创建一个函数,函数的作用是根据id查找name

1.创建表,插入数据

create table students(id int,name varchar(100));
insert into students(id,name) values(1,'annie'),(2,'bell'),(3,'danny');

2.创建函数

DELIMITER //
create function find_student(id int) returns varchar(100)
READS SQL DATA
begin
    declare sname varchar(100) default '';
    select students.name into sname from students where students.id=id;
    return sname;
end //
DELIMITER ;

需要注意的事项:

1)使用DELIMITER//修改分隔符

mysql的默认语句结束符号是分号,当mysql遇到分号时就自动执行当前语句。因为函数定义时包含多条sql语句,所以使用DELIMITER //先将分隔符设置为//,等函数创建语句完成后,再将分隔符改回分号即可。

2)READS SQL DATA

之前我没写这句话,但是创建时mysql报错,提示Error Code: 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)

上网查了一下,意思是没有声明mysql函数的类型:

mysql开启了bin-log, 我们就必须指定我们的函数是否是哪种类型:

3)使用局部变量

变量定义:我这里使用declare sname varchar(100) default ‘’;定义了局部变量sname,

变量使用:

可以使用select students.name into sname from students where students.id=id;为变量赋值

也可以直接使用set语句来赋值,如set sname=‘test’

3.执行函数:select 函数名(参数值);

select find_student(3);

Mysql自定义函数创建失败问题

案例

目前在项目中,执行创建mysql的函数出错,

mysql 创建函数出错信息如下:

Caused by: java.sql.SQLException: 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)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2373)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
    at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
    ... 35 more

这是因为有一个安全参数没有开启,log_bin_trust_function_creators 默认为0,是不允许function的同步的,开启这个参数,就可以创建成功了。

查看是否开启:

show variables like '%func%';
+---------------------------------+-------+ 
| Variable_name     | Value | 
+---------------------------------+-------+ 
| log_bin_trust_function_creators | ON | 
+---------------------------------+-------+ 
1 row in set (0.00 sec)

为on则是开启了

set global log_bin_trust_function_creators = 1;

可以通过这个命令设置,但是MySQL重启后就失效了。

所有最后是通过修改MySQL数据库的配置文件

在配置文件/etc/my.cnf的[mysqld]配置log_bin_trust_function_creators=1

Mysql中自定义函数的创建和执行方法是什么

修改完后重启MySQL。

读到这里,这篇“Mysql中自定义函数的创建和执行方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. python如何解决mysql where in对列表问题
  2. python mysql中in参数化的详细解析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:如何使用Logback设置property参数

下一篇:ReactNative状态管理rematch如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》