Mysql中自定义函数怎么创建

63次阅读
没有评论

共计 2853 个字符,预计需要花费 8 分钟才能阅读完成。

今天丸趣 TV 小编给大家分享一下 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, 我们就必须指定我们的函数是否是哪种类型:

1 DETERMINISTIC 不确定的

2 NO SQL 没有 SQl 语句,当然也不会修改数据

3 READS SQL DATA 只是读取数据,当然也不会修改数据

4 MODIFIES SQL DATA 要修改数据

5 CONTAINS SQL 包含了 SQL 语句

所以我加上了 READS SQL DATA

3)使用局部变量

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

变量使用:

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

也可以直接使用 set 语句来赋值,如 set sname= lsquo;test rsquo;

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 中自定义函数怎么创建”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,丸趣 TV 小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注丸趣 TV 行业资讯频道。

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2024-02-03发表,共计2853字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)