存储过程: 是在大型数据库系统中, 一组为了完成特定功能的sql 语句集。触发器:触发器是一种特殊类型的存储过程,它又不同于存储过程,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
存储过程:
是在大型数据库系统中,
一组为了完成特定功能的sql 语句集,
存储在数据库中,经过第一次编译后再次调用不需要再次编译,
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是数据库中的一个重要对象
优点:
1允许模块化程序设计(创建一次多次使用)
2允许更快执行
3减少网络流量
4更好的安全机制
格式:
delimiter // create procedure 储存名([ in ,out ,inout ]?参数名?数据类形...) begin sql语句 end // delimiter ;
调用过程:
用call 过程名( )
查看所有的存储过程show procedure status;
查看创建的存储过程show create procedure 过程名;
删除过程 drop procedure 过程名
in 表示参数从外部传入到里面使用(过程内部使用)
out 表示参数从过程里边把数据保存到变量中,交给外部使用,所有传入的必须是变量 如果说传入的out变量本身在外部有数据,那么在进入过程之后,第一件事就是被清空,设为null
inout 数据可以从外部传入到过程内部使用,同时内部操作之后,又会将数据返回给外部
触发器:
触发器是一种特殊类型的存储过程,它又不同于存储过程,
触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
作用:
1.可在写入数据表前,强制检验或转换数据
2.触发器发生错误时,异动的结果会被撤销
格式
delimiter //create trigger --触发器名字 触发时机 触发事件 on 表 for each row begin --操作的内容 end // delimiter ;
触发对象 :on 表 for each row 触发器绑定实质是表中的所有行,因此当每一行发生改变的时候,就会触发触发器
触发时机:每张表中对应的行都会有不同的状态,当sql 指令发生的时候,
都会令行中的数据发生改变,每一行总会有两个状态。操作数据之前(before),操作数据(after)之后
触发事件:
mysql中触发器针对的目标是数据发生改变,对应的操作只有(增,删,改)查询不发生数据的改变,
所以查询没有触发事件
注意事项:
一张表中,每一个触发器时机绑定的触发事件对应的触发器类型只能有一个;
一张表中只能有一个after insert 触发器 因此,一张表中最多的触发器只能有六个
创建存储过程
delimiter //create procedure adduser(in ucode varchar(50),in uname varchar(20),in urole int,in sex int,in tel varchar(30))begininsert into smbms_user (usercode,username,userrole,gender,phone)values(ucode,uname,urole,sex,tel);end//delimiter //查看存储过程 show procedure status;<insert id="saveuser">call adduser(#{usercode},#{username},#{userrole},#{gender},#{phone})</insert>public int saveuser(@param(usercode) string usercode,@param(username) string username,@param(userrole) integer userrole,@param(gender) integer gender,@param(phone) string phone);public list<user> finduserlistpage(string queryusername, integer queryuserrole, integer currentpageno, integer pageszie);public boolean saveuser(string usercode, string username, integer userrole,integer gender, string phone) {sqlsession sqlsession = null;int row = 0; // 受影响的行数try {sqlsession = mybatisutil.createsqlsession();row = sqlsession.getmapper(usermapper.class).saveuser(usercode, username, userrole, gender, phone);// 提交事务sqlsession.commit();} catch (exception e) {if (sqlsession != null) {sqlsession.rollback();}row = 0;e.printstacktrace();} finally {mybatisutil.closesqlsession(sqlsession);}if (row > 0) {return true;}return false;}userservice.saveuser(zhangcuishan, 亚索, 1, 2, 15645678941);
创建触发器
创建两张表create table my_goods(id int primary key auto_increment,name varchar(20) not null,inv int)create table my_orders(id int primary key auto_increment,goods_id int not null,goods_num int not null)insert into my_goods values(null,'手机',1000),(null,'电脑',500),(null,'游戏机',100);delimiter //create trigger a_i_o_t after insert on my_orders for each rowbeginupdate my_goods set inv =inv -new.goods_num where id=new.goods_id;end//delimiter ;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