MySQL-5-触发器和储存过程
一、题目

二、过程及结果截图
1、触发器
1)使用mydb16_trigger数据库,建立表
建表goods

建表orders

2)插入数据

3)建立触发器
(1)建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试
建立触发器
mysql> delimiter //
mysql> create trigger orders_after_insert-> after insert on orders for each row-> begin-> update goods set num=num-new.onum where gid=new.gid;-> end //
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;测试:添加订单
mysql> insert into orders(gid,name,price,onum,otime) values('A0001','橡皮',2.5,5,curdate());测试结果:

(2)建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量
建立触发器
mysql> delimiter //
mysql>
mysql> create trigger orders_after_delete_teigger-> after delete on orders for each row-> begin-> update goods set num=num+old.onum where gid=old.gid;-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
测试:删除订单
mysql> delete from orders where oid=1;
测试结果:

(3)建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新
建立触发器
mysql> delimiter //
mysql> create trigger orders_after_update-> after update on orders for each row-> begin-> update goods set num=num+old.onum where gid=old.gid;-> update goods set num=num-new.onum where gid=new.gid;-> end //
Query OK, 0 rows affected (0.04 sec)mysql> delimiter ;测试:修改订单,先取消后添加
提前添加订单,'小楷本'10份
mysql> insert into orders(gid,name,price,onum,otime) values('B0001','小楷本',2.8,10,curdate());
修改订单,'小楷本'15份
mysql> update orders set onum=15 where oid=2;测试结果:

2、储存过程
(1)使用mydb7 openlab库
mysql> use mydb7_openlab ;Database changed(2)创建提取emp_new表所有员工姓名和工资的存储过程s
先查询emp_new表所有员工姓名和工资

成功后再创建s1
mysql> delimiter //
mysql> create procedure s1()-> begin-> select name 姓名,incoming 工资 from emp_new;-> end //
Query OK, 0 rows affected (0.03 sec)mysql> delimiter ;测试:

(3)创建存储过程s2,实现输入员工姓名后返回员工的年龄
先查询emp_new表“王五”的年龄

成功后再创建s2
mysql> delimiter //
mysql> create procedure s2(in iname varchar(11),out oage int)-> begin-> select age into oage from emp_new where name=iname;-> end //
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;
测试:
mysql> call s2('王五',@oage);
Query OK, 1 row affected (0.00 sec)
(4)创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资
先查询emp_new表部门号101部门的平均工资

成功后再创建s3
mysql> delimiter //
mysql> create procedure s3(in idept int,out avg_incoming decimal(8,2))-> begin-> select avg(incoming) into avg_incoming from emp_new where dept2=idept;-> end //
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
测试:
mysql> call s3(101,@avg_inc);
Query OK, 1 row affected, 1 warning (0.00 sec)
