简单了解什么是存储过程,以及存储过程的使用场景,和存储函数、触发气的区别:
存储过程,存储函数,触发器和事件是自从MySQL 5.0版本以来,这些功能被添加到MySQL数据库引擎,使mysql更加灵活和强大。
存储过程:
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。
存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。
使用场景:
存储过程处理比较复杂的业务时比较实用。比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。也就是说存储过程可以给我们带来运行效率提高的好处。另外,程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。
其威力和优势主要体现在:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储过程,只需要连接一次数据库就可以了。
3.存储过程可以重复使用, 而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
存储过程(procedure)和存储函数(function)的区别:
1: 存储函数和存储过程统称为存储例程(store routine),存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。
2:存储过程一般都是独立使用,使用call 加存储过程名调用。而存储函数可以在SQL语句(select)中使用(比如在查询是经常使用的系统自定义的sum 、avg 、max函数)。
3:返回值不同 ,存储函数要求必须有返回值,且仅返回一个结果值,而存储过程可以没有返回值还可以返回一个结果集(out,inout)
4:参数不同,存储函数的参数类似于存储过程的IN入参,而存储过程即可有入参IN,也可由出参OUT,和INOUT
(1): IN 数据只是从外部传入内部使用(值传递),可以是数值也可以是变量
(2): OUT只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量
(3): INOUT 外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量
存储过程和触发器的区别:
触发器是一种特殊的存储过程,存储过程需要手动调用,而触发器是经过事件触发而执行的,触发器是绑定一张表,在表中创建保存,而存储过程是在一个数据库中创建并保存。
触发器=存储过程+事务+自定义约束
存储过程的编写:
基本语法:
1)
存储过程的参数有 入参 IN, 出参OUT , INOUT
IN从外部传参在内部使用,调用时必须传值
OUT就是相当于返回值
INOUT把出参和入参放到一块儿,在调用时传值,值可以返回
2)
declare用来声明变量,default 赋默认值,set 赋值
3)创建存储过程:
delimiter$
Create
procedure 存储过程名( )
Begin
……………(末尾要有 分号; )
End$
delimiter
注:delimiter$和 delimiter // 差不多,看每个人的习惯,delimiter是分割符,mysql 默认’
; ’是分隔符,如果不提前声明分割符,编译器会把存储过程当成 sql 语句执行,会报错,
所以要事先用delimiter关键字声明,在用完以后 还要把分割符还原(如果不还原可能出现我下面写例子的那种情况,一直结束不了,需要$符号后才能成功执行,这个窗口就废了)。
4)调用存储过程
Call存储过程名( )
注意:如果存储过程后面必须加( ),如果有参数 在扩内写上 参数
5)删除存储过程
Drop
procedure 存储过程名
注意:不能删除一个 在其他 存储过程使用了的 存储过程
6)显示所有数据库所有存储过程的 基本信息
Showprocedure status
7)
show create procedure 存储过程名
显示某一个mysql存储过程的详细信息
一些例子:
无参无返回值:
查看book表中的所有数据
DELIMITER $
create procedure pro_test01()
begin
select * from book;
end $
delimiter
调用: pro_test01();
有参无返回值:
根据name 查询详细信息
delimiter $
create procedure pro_test02(IN namevarchar(255))
begin
select* from book where bname=name;
end$
delimiter
调用及结果:
无参有返回值:
查看book中有多少条记录
delimiter $
create procedure pro_test03(OUT sum int)
begin
select count(*) into sum from book;
end $
delimiter
调用及结果:
没有写delimiter 还原 了,一直结束不了,只能输$符
有参有返回值:
求从1 加到 num的和
delimiter $
create procedure pro_test04(IN num int,OUTresult int)
begin
declarei int default 1; #定义一个变量i,初始值为 1
declare sum int default 0; #定义一个变量sum ,初始值为 0
WHILEi < num DO
SETsum = sum +i;
SETi = i+1;
ENDWHILE;
SETresult=sum;
end$;
delimiter
调用及结果(1-10的和)
参数是INOUT
传年份返回年龄
delimiter $
create procedure pro_test05(INOUT age int)
begin
set age = 2018 - age;
end $
delimiter
调用及结果
在设置变量的值时 要用set . @代表局部表量,@@代表全局变量
if else 用法
delimiter $
create procedurepro_test09(IN num int,OUT sys varchar(255))
begin
if num=0 then
set sys='等于0';
elseif num>0 then
set sys='大于0';
elseif num<0 then
set sys='小于0';
end fi
end$
delimiter