1、概述
前面学习的 MySQL 相关知识都是针对一个表或几个表的单条SQL 语句,使用这样的SQL语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条SQL语句一起去处理才能够完成,这时候就可以使用存储过程,轻松而高效的去完成这个需求,有点类似shell脚本里的函数
2、简介
MySQL数据库存储过程是一组为了完成特定功能的SQL语句的集合。存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用sQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。存储过程在数据库中创建并保存,它不仅仅是SQL语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。
3、优点
1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2、SQL语句加上控制语句的集合,灵活性高
3、在服务器端存储,客户端调用时,降低网络负载
4、可多次重复被调用,可随时修改,不影响客户端调用
5、可完成所有的数据库操作,也可控制数据库的信息访问权限
4、创建存储过程
使用CREATE PROCEDURE语句创建存储过程(与Shell函数差不多,代码的复用)
格式:
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE xxx() #创建存储过程,过程名为xxx,不带参数
BEGIN #过程体以关键字 BEGIN 开始
sql语句; #过程体语句
END $$ #过程体以关键字 END 结束
DELIMITER ; #将语句的结束符号恢复为分号
例:
delimiter $$ #定义结束符
create procedure cc() #创建存储过程(过程名)
begin #开启存储过程
create table yy (id int(10),name char(10),score int(10));
insert into yy values (1,'zhang',20);
select * from yy; #过程体
end $$ #结束存储过程
delimiter ; #将结束符还原
PS:
存储过程的主体部分,被称为过程体
以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
以DELIMITER开始和结束
mysql> DELIMITER $$ $$是用户自定义的结束符
省略存储过程其他步骤
mysql> DELIMITER ; 分号前有空格
调用存储过程
call cc
带参数的存储过程
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
例:
delimiter $$
create procedure tt(in inname varchar(16))
begin
select * from test1 where a_name='aaaa';
end $$
delimiter ;
call tt('aaaa');
查看存储过程
show procedure status;
show create procedure 存储过程名称;
修改存储过程
ALTER PROCEDURE <过程名> [<特征>... ]
ALTER PROCEDURE tt MODIFIES SQL DATA SQL SECURITY INVOKE;
MODIFIES SQL DATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
删除存储过程
DROP PROCEDURE IF EXISTS 过程名; #所以可以使用if exists确定存在后删除,不存在则不执行删除。
例:
drop procedure if exists cc;