(小白)MySQL基础学习006 20201022
历程
- 自定义函数
用户自定义,由多条语句组成
矛盾:mysql在遇到分号(;)会自动执行,但自定义函数内多条语句间的间隔又需要分号,解决方法:
修改临时语句结束符
delimiter
delimiter 新符号(非内置符号即可)
- 创建函数
自定义函数的几个要素:
function关键字,函数名,参数(形参和实参【可选】),确认函数返回值类型,函数体,返回值
修改语句结束符
create function 函数名(形参) returns 返回值类型
begin
//函数体
return 返回值类型 //数据必须与结构定义的类型一致
end
修改语句结束符(改回来)
delimiter $$
create function my_func1() returns int
begin
return 10;
end
$$
delimiter ;
并不是所有函数都需要begin和end
如果在一个函数体中,只有一条语句,可以省略
create function my_func2() returns int
return 100;
需要为形参指定类型,形参本身可以有多个
变量名 字段类型
create function my_func3(int_1 int,int_2 int) returns int
return int_1+int_2;
- 查看函数
1、通过查询function状态,查看所有function
show function status\G;
2、查看函数的创建语句
show create function my_func1;
-
调用函数
与内置函数调用相同
select my_func1(),my_func2(),my_func3(100);
-
删除函数
drop function my_func1;
自定义函数,只有当前用户所属的数据库可以使用
可以在不同的数据库中查看到函数存在,但能使用
函数必须规范返回值,在函数内不能使用select指令,select一旦执行就会得到一个结果result set
select 字段 into @变量;(唯一可用)
- 流程结构案例:
需求:从1开始,走到用户传入对应的值为止,自动求各,凡是5的倍数都不要
delimiter $$
create function my_sum(end_value int) returns int
begin
declare res int default 0;
declare i int default 1;
mywhile:while i<= end_value do
if 1%5=0 then
set i=i+1;
iterate mywhile;
end if;
set res=res+i;
set i=i+1;
end while mywhile;
return res;
end
$$
delimiter ;
- 变量作用域
局部作用域
会话作用域
全局作用域
set @name="张三";
create function my_func4() returns char
return @name;
select my_func4();
这里需要指定char的长度
set @name="张三";
create function my_func4() returns char(5)
return @name;
select my_func4();
-
创建过程体
-
查看过程
和function一样 -
调用过程
call my_pro1();
- 删除过程
drop procedure my_pro1();
- 存储过程的形参类型
- 触发器
- 使用
想要生成订单的时候,库存表自动更改
创建两张表:
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
inv int
)charset utf8;
create table my_orders(
id int primary key auto_increment,
goods_id int not null,
goods_num int not null
)charset utf8;
insert into my_goods values(null,“手机”,1000),(null,“电脑”,500),(null,“游戏机”,100);
- 创建
delimiter $$
create trigger after_insert_order_t after insert on my_orders for each row
begin
update my_goods set inv=inv-1 where id=1;
end
$$
delimiter ;
显示触发器
show triggers;
show triggers\G;
查看触发器的创建语句
show create trigger after_insert_order_t;
触发触发器
insert into my_orders values(null,1,1);
select * from my_orders;
select * from my_goods;
删除触发器:
drop trigger after_insert_order_t;
触发器应用
delimiter $$
create trigger a_i_o_t after insert on my_orders for each row
begin
update my_goods set inv=inv-new.goods_num where id=new.goods_id;
end
$$
delimiter ;
select * from my_orders;
select * from my_goods;
insert into my_orders values(null,3,5);
如果库存不够
delimiter $$
create trigger b_i_o_t before insert on my_orders for each row
begin
select inv from my_goods where id=new.goods_id into @inv;
if @inv<new.goodS_num then
insert into XXX values("XXX");
end if;
end
$$
delimiter;
select * from my_goods;select * from my_orders;
insert into my_orders(null,3,5);
insert into my_orders values(null,3,500);