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存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

如何从 PHP 代码中调用 MySQL 存储过程?

java 登录过程 - android片段,异步任务登录,Asp.net控制器,存储库

[转]MYSQL 创建存储过程

怎么在mysql中查询已建立的存储过程