mysql自5.0起就支持存储过程,存储过程通俗的讲就是在一段封装过的sql,但不仅仅只有sql那么简单,通常还会有变量、条件判断、循环体,游标等。
存储过程的作用
在很多场景中,需要将多个表的数据处理,来产生新的我们需要的数据。这些多个表的数据并不能通过连接等查询方式给出,只能通过判断和循环才能产生。这个时候,就可以利用存储过程来实现。
此外,存储过程还有一些好处,比如性能比较高,还有能减少网络请求。如果不用存储过程来实现的话,使用php来实现就需要调用多次mysql,产生多次请求。
当然,存储过程也不是没有缺点的,它比较哪调式,另外不支持集群。
创建存储过程
创建存储过程语法如下:
create procedure 过程名(参数) begin 过程体end
关于参数,设置参数语法为
[in|out|inout] 参数名 类型
in 表示该变量只能在过程体内使用
out 表示该变量只能在过程体外使用
inout 表示在过程体内和体外都能使用
下面,我们来创建一个最简单的存储过程。
create procedure p1(in x int) begin select x;end;
变量
在mysql中变量分为全局变量和局部变量。
全局变量以@开头,无需声明,直接使用即可,如
set @name='gwx';
局部变量需要先声明,局部变量的初始化方法如下:
declare x int default 0;
下面我们来完成一个存储过程:根据路程计算车费,3公里内按6远计算,超过的距离按每公里1.2元计算.
-- distance 路程create procedure p1(in distance float)begin declare d_money float default 0; if distance>3 then set d_money=6+(distance-3)*1.2; else set d_money=6; end if; select d_money;end;
游标
拿php做比较,游标有点想foreach,每次循环获取一条记录。
定义一个游标:
declare 游标名 cursor for select 语句
开启关闭游标:
open 游标名
close 游标名
取游标数据:
fetch 游标名 into 变量名
可以这么简单的介绍,大家会有疑惑,不清楚应该如何去使用。下面,来看一个实例,从实例中学习如何使用游标。
用游标完成一个非常简单的功能,将test_cursor表中数字全部累加起来。
create table if not exists test_cursor( num1 int(10) unsigned not null default 0, num2 int(10) unsigned not null default 0); insert into test_cursor(num1,num2) values(1,1),(2,2),(3,3); create procedure `test_cursor`()begin declare sum int(10) default 0; declare n1,n2 int(10); declare done int default 0; declare cur cursor for select num1,num2 from test_cursor; declare continue handler for sqlstate '02000' set done=1; open cur; -- 打开游标 while done=0 do fetch cur into n1,n2; if done=0 then -- 注意这里为什么加if条件,不加的话,最后一个值会被多加一遍 set sum=sum+n1+n2; end if; end while; close cur; -- 关闭游标 select sum;end
这里有几点需要注意,首先局部变量的定义必须要在声明游标前声明。
另外,这里declare continue handler for sqlstate '02000' set done=1; 表示游标结束后将done设置为1,以结束循环。
以上就是mysql变量、游标及存储过程的应用的详细内容。