概念
存储过程是一组为了完成特定功能的sql语句的机会,经过编译存储在数据库中,用户通过指定存储过程的名字并给出参数来执行。一次编写多次调用,避免开发人员重复编写相同的SQL,存储过程是在数据库存储和执行的,可以减少客户端和服务器之间的数据传输,提高效率。
优点
- 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程,多次调用。
- 执行速度更快,如果某操作需要执行大量的SQL语句,存储过程比普通的SQL执行速度更快。
- 更好的安全机制,对于没有权限执行存储过程的用户,可以通过授权的方式来执行存储过程。
语法
在非命令行模式下的语法结构:
create procedure sp_name ([proc_paramter[...]])
begin
routine_body;
end;
在命令行模式下的语法结构:
delimiter $$
create procedure sp_name ([proc_paramter[...]])
begin
routine_body;
end;
$$
sp_name:存储过程的名字
proc_paramter:参数列表
三部分组成:输入输出类型,参数名称,参数类型
in表示入参,out表示出参,参数类型为MySQL数据库的任意数据类型
routine_body:SQL语句
begin/end 来标识SQL语句的开始和结束
入参的存储过程
create procedure add_name(in target int)
begin
declare name varchar(20); --定义一个变量
if target = 1 then
set name = "MySQL";
else
set name = "Java";
end if;
insert into user(name) values (name);
end;
调用存储过程
call add_name(11);
出参存储过程
create procedure count_of_user(out count_num int)
begin
select count(*) into count_num from user;
end;
调用存储过程
call count_of_user(@cout_num);
select @cout_num;
流程控制语句
if
create procedure example_if(in x int)
begin
if x = 1 then
select name from user;
elseif x = 2 then
select age from user;
end if;
end;
case
create procedure example_case(in x int)
begin
case x
when 1 then select name from user;
when 2 then select age from user;
else select money from user;
end case;
end;
while
create procedure example_while(out sum int)
begin
declare i int default 1;
declare s int default 0;
while i<=100 do
set s=s+i;
set i=i+1;
end while;
set sum = s;
end;
查看执行数据库有哪些存储过程
show procedure status where db = ‘数据库名’\G;
删除存储过程
drop procedure 存储过程的名称;