前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MySQL】存储过程

【MySQL】存储过程

作者头像
看、未来
发布2021-12-20 19:45:55
7.9K0
发布2021-12-20 19:45:55
举报

文章目录

存储过程:一段SQL语句的集合

为什么使用存储过程

1、解耦合。数据库部分可交由专门的数据库管理人员去做,像前后端联合协作那样提供接口供后端调度。(这两天对后端开发又有了新的理解:作为前端和数据库之间数据转接的中间人。不论是哪种业务,后端架构如何发展,不都是为了数据走的更顺畅点吗?)作为后端开发人员,SQL是必备语言,但是如果条件允许,专业的事情交给专业的人来做。

2、命令短小。使用过就知道了。几十上百个字节的命令压缩成十几个字节,更不需要多次发送。可能一项业务,需要先插入、再修改、再删除、再查询返回结果,本来四条命令,谁来写先不说,这四条命令哪条单拎出来不比一条存储过程调用命令长。

3、执行速度快。我们每个SQL语句执行都需要经过编译,然后再运行。但是存储过程只需要一次编译,多次运行。

4、提高系统安全性。存储过程可以使用权限控制,而且参数化的存储过程可以有效防止注入攻击,保证了其安全性。

5、重用性强。一次编写,随处调用。

6、不用考虑那么多并发的事情。如果在服务端发送多条命令到数据库执行,那可真说不准发到哪一条的时候线程就被叉出去了。

书写基本格式

代码语言:javascript
复制
create procedure 存储过程名(参数列表)
begin
存储过程体
end

示例:

代码语言:javascript
复制
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 ;  #将语句的结束符号恢复为分号

调用的时候就:

代码语言:javascript
复制
call login(参数)

关于参数

IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

一般我只用 IN,out 什么?select 就可以返回结果了,还要 select ··· into out_参数?

存储过程中开启事务

代码语言:javascript
复制
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++接收其他结果集的方法。

分支循环啥的我也没有用过,所以也就不写在里面啦。后面整批量插入的时候应该要用到,用到再补吧。

设置变量

在存储过程中如果要设置变量:

代码语言:javascript
复制
declare 变量 数据类型;
代码语言:javascript
复制
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$
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 为什么使用存储过程
  • 书写基本格式
  • 关于参数
  • 存储过程中开启事务
  • 返回多个结果集
  • 设置变量
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档