MySQL自定义函数
MySQL自定义函数MySQL自定义函数能返回字符串,整数或实数;可以定义一次作用于一行的简单函数,或作用于多行的组的集合函数
一、创建自定义函数
CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL} BEGIN //函数实现的语句 END;
参数说明
1、aggregate 指定创建的函数是普通的自定义函数,还是AGGREGATE函数。
2、function_name 是用在SQL声明中以备调用的函数名字。
3、RETURNS 说明函数返回值的类型。
实例
mysql> delimiter //
mysql> create function fun_add_rand(
-> in_int int
-> )
-> RETURNS int
-> BEGIN
-> declare i_rand int;
-> declare i_return int;
->
-> set i_rand=floor(rand()*100);
-> set i_return = in_int + i_rand;
->
-> return i_return;
-> END;
-> //
mysql> delimiter ;
delimiter $$
/* 参数为 int类型 */
create function rand_string(n INT)
/*设置返回值类型 为字符串*/
returns varchar(255)
/* 函数开始 */
begin
/* 的定义局部变量,有默认值*/
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
/*在定义空变量*/
declare return_str varchar(255) default '';
/* 定义整型 值为 0*/
declare i int default 0;
/* 循环 */
while i < n do
/* 制作随机字符串*/
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
/* 结束循环 */
end while;
/* 返回制作的随机字符串*/
return return_str;
end $$
delimiter ;
二、使用自定义函数
以上示例函数的使用
mysql> select id from test_inn;
+------+
| id |
+------+
| 1 |
| 1 |
| 1 |
| 1 |
+------+
mysql> select fun_add_rand(id) from test_inn;
+------------------+
| fun_add_rand(id) |
+------------------+
| 91 |
| 34 |
| 93 |
| 66 |
+------------------+
2、rand_string自定义函数
select rand_string(5);
三、删除自定义函数
语法
DROP FUNCTION [ IF EXISTS ] function_name;
例如
mysql> drop function if exists fun_add_rand;
四、查看自定义函数创建信息
语法
SHOW CREATE FUNTION function_name;
五、在MySQL创建用户自定义函数时,报以下错误
ERROR 1418 (HY000): 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)
这是因为有一个安全参数没有开启,log_bin_trust_function_creators 默认为0,是不允许function的同步的,开启这个参数,就可以创建成功了。
mysql> show variables like '%fun%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec)
mysql> set global log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%fun%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
1 row in set (0.00 sec)