MySQL存储过程
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储过程相关的知识,希望对你有一定的参考价值。
存储过程:一段SQL语句的集合
为什么使用存储过程
1、解耦合。数据库部分可交由专门的数据库管理人员去做,像前后端联合协作那样提供接口供后端调度。(这两天对后端开发又有了新的理解:作为前端和数据库之间数据转接的中间人。不论是哪种业务,后端架构如何发展,不都是为了数据走的更顺畅点吗?)作为后端开发人员,SQL是必备语言,但是如果条件允许,专业的事情交给专业的人来做。
2、命令短小。使用过就知道了。几十上百个字节的命令压缩成十几个字节,更不需要多次发送。可能一项业务,需要先插入、再修改、再删除、再查询返回结果,本来四条命令,谁来写先不说,这四条命令哪条单拎出来不比一条存储过程调用命令长。
3、执行速度快。我们每个SQL语句执行都需要经过编译,然后再运行。但是存储过程只需要一次编译,多次运行。
4、提高系统安全性。存储过程可以使用权限控制,而且参数化的存储过程可以有效防止注入攻击,保证了其安全性。
5、重用性强。一次编写,随处调用。
6、不用考虑那么多并发的事情。如果在服务端发送多条命令到数据库执行,那可真说不准发到哪一条的时候线程就被叉出去了。
书写基本格式
create procedure 存储过程名(参数列表)
begin
存储过程体
end
示例:
delimiter $ #将语句的结束符号从分号;临时改为$(可以是自定义)
create procedure reg(in pwd_ int, in phone_num_ bigint)
begin
insert into User(pwd,phone,money) values(pwd_,phone_num_,0);
select max(id_) from User;
end$
delimiter ; #将语句的结束符号恢复为分号
调用的时候就:
call login(参数)
关于参数
IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
一般我只用 IN,out 什么?select 就可以返回结果了,还要 select ··· into out_参数?
存储过程中开启事务
create procedure booktickets_ST(in id_ int, in cid_ int, in site_ int, in money_ int)
begin
DECLARE exit handler for sqlexception
BEGIN
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
ROLLBACK;
END;
start transaction;
update Pick set site_ST_left=site_ST_left-1 where cid=cid_;
insert into User_Pick values(id_,cid_,site_,1);
update User set money=money-money_;
commit;
end$
返回多个结果集
在存储过程中如果执行了不下一次查询,会返回多个结果集。但是目前我还没有找到C++接收其他结果集的方法。
分支循环啥的我也没有用过,所以也就不写在里面啦。后面整批量插入的时候应该要用到,用到再补吧。
设置变量
在存储过程中如果要设置变量:
declare 变量 数据类型;
create procedure booktickets_CP(in id_ int, in cid_ int, in site_ int, in money_ int)
begin
declare s char(8);
declare i bigint;
declare j int;
DECLARE exit handler for sqlexception
BEGIN
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
ROLLBACK;
END;
set j=site_ div 10000;
set s=concat('site_C',j);
set i=pow(1000,j-1);
start transaction;
update Pick set siteC=siteC+i,s=s-1 where cid=cid_;
insert into User_Pick values(id_,cid_,site_,1);
update User set money=money-money_;
commit;
end$
以上是关于MySQL存储过程的主要内容,如果未能解决你的问题,请参考以下文章