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状态,查看所有functionshow 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);