您好,欢迎访问一九零五行业门户网

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 databegin 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 ‘’;定义了局部变量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中自定义函数的创建和执行方法是什么的详细内容。
其它类似信息

推荐信息