什么是存储过程
存储过程就简单来讲,是一条或多条MySQL语句的集合,可以看做一个批处理文件,虽然它的作用不仅仅局限于批处理.
存储过程的优点
-
把需要处理的内容进行封装,简化了复杂的操作
-
不要求反复建立一系列处理步骤,所有的开发人员和应用程序都可以使用同一存储过程
-
简化对变动的管理,如果表名等其他发生了变动,只需要修改存储过程即可,外界不需要对此产生感知
-
提高性能,由于存储过程是预编译的,所以执行比普通的SQL语句执行要快
-
减少网络传输带宽,如果是大量的sql,将会导致大量的带宽被浪费,因为存储过程是保存在数据库,所以可减少部分网络传输载荷
-
安全可靠,可自由的进行存储过程权限的分配
缺点
-
难以调试,如果存储过程出现了问题,很难进行调试
-
难以编写,编写存储过程比普通的SQL语句更复杂,对编写存储过程的人的技术水平要求很高
-
可能会没有创建存储过程的权限
存储过程的编写
表的初始化
create table product(
id int primary key auto_increment,
prod_name varchar not null,
prod_price decimal(8,2) not null,
prod_desc text
)
插入数据略过
创建存储过程
crate procedure productprinting()
begin
select avg(prod_price) as avg_price
from product;
end
解释:
crate procedure productprinting()
表示创建一个叫productprinting
的存储过程
begin
和end
之间填写存储过程的具体内容
调用存储过程
call productprinting();
然后就能在得到的结果中看到调用存储过程返回的结果.
注意: 如果是cmd环境,为了确保能够完整的输入,需要将mysql的结束符改成其他的特殊字符.
delimter //
就是可以将结束符定义成//
,只需要在cmd环境使用//
代替原来的;
就可以了
删除存储过程
drop procedure productprinting;
存储过程的高级用法
变量
crate procedure productInfo(
out p1 decimal(8,2),
out p2 decimal(8,2),
out p3 decimal(8,2)
)
begin
select avg(prod_price) into p1 as avg_price
from product;
select min(prod_price) into p2 as avg_price
from product;
select max(prod_price) into p3 as avg_price
from product;
end
解释:
-
此存储过程接收三个参数,并把结果存入变量
p1
,p2
和p3
中. -
存储过程中一般存在三种类型的参数:IN,OUT,INOUT类型
In类型:接收外部参数
Out类型:输出到外部参数
InOut类型:可接收外部参数也可以输出到外部参数
调用
call productInfo(@avgPrice,@minPrice,@maxPrice);
select @avgPrice,@minPrice,@maxPrice;
注意: 所有的MySQL变量都必须以@
开始
其他用法
存储过程肯定不止上述所讲的内容,还可以使用if
,while
等进行更加强大的判断.