# 在MySQL数据库中创建函数(Function)
## 语法
```
CREATE FUNCTION func_name (参数) //括号是必须的,参数是可传可不传
RETURNS type
BEGIN
END;
# func_name函数名
# type 类型 列如 varchar int date
```
## 调用
```
select func_name();
```
## 在navicat创建函数
### 点击新建函数
### 选择函数,下一步
### 输入你要传入的参数: id 类型: int
#### 列如
下一步,输入你要需要的返回值类型, 长度 varchar 50
点击完成, 如果失败需要手动修改参数:
```
进入数据库
查询
show variables like '%log_bin_trust_function_creators%';
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF
修改log_bin_trust_function_creators
set global log_bin_trust_function_creators=TRUE;
(一次性的,重启无效)
```
### 永久性
找到mysql安装目录, 找到my.cnf, 我安装的mysql目录下没有这个文件, 修改my.ini文件
```
在mysqld中增加
[mysqld]
log_bin_trust_function_creators=1
重新启动mysql服务
```
### 获取学生表的student_id=id的名字
```
列如:
BEGIN
DECLARE n VARCHAR(50); # 定义变量
SELECT students.`name` into n FROM students WHERE students.student_id=id;
RETURN n;
END
```
### 逻辑性函数, 获取增长号, 列如订单号(年月日时分秒毫秒(取3位)+增长序列),需要不同增长序列号
#### 创建时 传入参数为:name, 返回值 int
```
BEGIN
DECLARE curr_v, max_v, step_v, start_v INT;
DECLARE curr_d DATE;
DECLARE new_v INT;
SELECT curr_value, max_value, step_value, start_value, curr_date into curr_v, max_v, step_v, start_v, curr_d
FROM tb_sequence
WHERE tb_sequence.name =`name`;
if curr_d != CURRENT_DATE() then # 日期不是当天, 将curr_value(当前序列号值)设为初始值(start_value),将日期更新为当天
set new_v = start_v;
UPDATE tb_sequence
set curr_value=tb_sequence.start_value, curr_date=CURRENT_DATE()
where tb_sequence.name=`name`;
else
set new_v = curr_v + step_v; # 每调用一次函数, 将curr_value=curr_value+增加值
if new_v > max_v then # 超过最大值,给他返回null
return null;
end if;
UPDATE tb_sequence
set curr_value=new_v
where tb_sequence.name=`name`; # 修改当前序列号值
end IF;
RETURN new_v;
END
```
#### 表的设计
```
start_value 序列号起始值
max_value 序列号最大值
step_value 序列号每次的增加量
curr_value 当前的序列号值
curr_date 当前日期,即今日日期
```
#### 表
# navicat 其他中文正常, 注释乱码问题
控制面板 ->区域语言->管理->更改系统区域设置 ->