存储过程可以说是测试开发都绕不开的结,作为测试我们在验证某个列表查出来数据对不对时,我们在界面新增一条数据,删除一条数据时,以及修改某个信息时,都可能调用了数据库里边某个存储过程,今天我们一起来接起存储过程的详细面纱。
一: 存储过程定义
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
二: 存储过程的特点
1、能够完成较复杂的判断和运算,同时执行速率更快:对于很简单的sql,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通sql快。
2、 减少网络流量:存储过程直接就在数据库服务器上跑,所有的数据访问都在数据库服务器内部进行,不需要传输数据到其它服务器,所以会减少一定的网络传输。如果通过网络发送的SQL多行代码到你的SQL Server中,这会影响网络性能。
3、安全:用户无需执行任何直接的语句可以执行存储过程。提高代码安全,防止 SQL注入。
4、可维护性:的存储过程有些时候比程序更容易维护,这是因为可以实时更新DB端的存储过程。 有些bug,直接改存储过程里的业务逻辑,就搞定了。
5、可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化。
三:存储过程语法
1、创建存储过程的简单语法
a、create procedure procedure_name()
b、begin #存储过程开始
c、 #存储过程内容
d、End #存储过程结束
2、创建一个简单的存储过程
a、create procedure testa()
b、begin
c、select * from ecs_users;
d、end
3、调用存储过程
call testa();
四:变量定义
1、变量分类
存储过程中的变量分为全局变量、局部变量、用户变量。全局变量是指变量在多个begin与end块中都起作用,要放在块之前声明;局部变量是指该变量只在存储过程的begin与end之间起作用,end后变量就失去作用;用户变量是在存储过程外边定义的变量。
2、变量声明
局部变量和全局变量声明语法:
DECLARE variable_name datatype [DEFAULT value];
DECLARE:声明关键字,一句declare只声明一个变量,变量必须先声明后使用
variable_name:变量名
datatype:数据类型,变量具有数据类型和长度,与mysql的SQL数据类型保持一致,因此甚至还能制定默认值、字符集和排序规则等;
DEFAULT value:默认值,可以缺省
用户变量声明语法:
Set @variable_name1=0;
Set @variable_name2=``;
注意:用户变量前边要加@符号。
3、变量赋值
赋值语法:
Set a=123;
Set b=”zhangsan”;
或者:
Select user_name into b from ecs_users where user_id=1;
这种赋值方法是将Select user_name from ecs_users where user_id=1;查出来的值付给变量b。
需要返回变量值直接使用select 变量名;
实例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `testa`()
BEGIN
DECLARE b VARCHAR(10) DEFAULT null;
set b="Jack"; #声明全局变量
BEGIN
DECLARE userscount int default 0; #声明局部变量
select count(*) into userscount from student; #给变量赋值
select userscount; #返回变量值
END;
BEGIN
DECLARE avg_score int DEFAULT 0; # 声明局部变量
select avg(score) into avg_score from student st ,sc where st.sno=sc.sno and sname=b; #给变量赋值,同时使用了全局变量b
select avg_score; #返回变量值
END;
END
运行结果1:
五:存储过程参数
存储过程在定义时可以设置其参数类型,一共有四种情况:
create procedure testa() #不传递参数
create procedure testa(in 参数名称 参数类型) #传入参数
create procedure testa(out 参数名称 参数类型) #返回参数
create procedure testa(inout 参数名称 参数类型) #可变参数
1、不传递参数的存储过程
不传参的存储过程调用时直接为call procedure_name();
实例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `DELETE_users`()
BEGIN
DELETE from ecs_users where alias="zhangsan";
END
运行结果:
2、in类型
in类型的参数表示在调用存储过程时必须给该存储过程传入一个值,如果存储过程没有指定参数类型也默认为in类型。IN类型参数一般只用于传入,在调用过程中一般不作为修改和返回。
实例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`(in username VARCHAR(20))
BEGIN
DECLARE avg_score int DEFAULT 0;
select avg(score) into avg_score from student st ,sc where st.sno=sc.sno and sname=username;
select avg_score;
END
运行结果:
3、out类型
out类型的参数在调用的存储过程时也必须指定,但只能的是变量,不能是常量,只能用于传出值,不能用于传入值,在调用存储过程中可以改变其值,并返回。
实例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`(in username VARCHAR(20),out max_score int)
BEGIN
select max(score) into max_score from student st ,sc where st.sno=sc.sno and sname=username;
END
运行结果:
4、inout类型
Inout类型参数集合了in和out类型的所有特征,调用时既可以传入参数值,也可修改参数值,还能返回值。调用时传入参数值只能传入变量,不能是常量。
实例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test2`(inout username VARCHAR(20),inout min_score int)
BEGIN
set username="Jack";
select min(score) into min_score from student st ,sc where st.sno=sc.sno and sname=username;
END
运行结果:
这一章我们学习了测试开发的储存过程的上半部分,下一章我们继续学习测试开发的储存过程的下半部分。大家喜欢的话记得每天来这里和小编一起学习涨薪技能。