【无标题】在MySQL数据库中创建函数(Function)

# 在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 其他中文正常, 注释乱码问题

控制面板 ->区域语言->管理->更改系统区域设置 ->

 


















 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值