一、什么是MYSQL存储过程?
MySQL存储过程实现了比MySQL函数更为强大的功能,数据库开发人员可以将功能复杂、使用频繁的MySQL代码封装成MySQL,从而提高MySQL代码的重用性。存储过程保存的是一段存储程序,没有保存表数据。
二、MySQL存储过程
1.创建存储过程的语法格式
1.存储过程是数据库的对象,因此在创建存储过程时,需要指定该存储过程隶属于哪个数据库。
2.同一数据库内,存储过程名不能重名。
语法格式如下:
create procedure 存储过程名(参数1,参数2,)
[存储过程选项]
begin
存储过程语句块
end;
存储过程有3种类型的参数:in参数、out参数、inout参数。
in:默认选项,输入参数,该参数只参与内部操作,不会作为返回值。
out:输出参数,该参数参与内部过程之后,会作为返回值返回给调用程序。
inout:既是输入参数,又是输出参数。
存储过程由以下一种或几种选项组合而成。
language sql
[not] deterministic
constains sql | no sql | reads sql date | modifies sql data
sql security {definer | invoker}
comment ‘注释’
language sql:默认选项,用于说明存储过程语句块使用SQL语言编写
deterministic(确定性):默认not deterministic,即返回值不确定
contains sql:默认选项,表示存储过程语句块中不包含读或写数据的语句。
no sql:表示存储过程语句块中不包含SQL语句。
reads sql data:表示存储过程语句块中包含select查询语句。
modifies sql data:表示存储过程语句块中包含更新语句。
sql security definer:该存储过程只能由创建者调用。
sql security invoker:默认选项,该存储过程可被其他用户调用。
comment:添加功能说明等注释信息
举个栗子:
delimiter $$ --修改结束符
create procedure getnum(in stuno varchar(5),out num int) #in为默认选项,可不写
reads sql data
begin
set @num=0;
select count(degree) into num from score where Sno=stuno; #该用法只适合在存储过程中使用
end
$$
delimiter ; --改回结束符
2.存储过程的调用
调用存储过程需使用call关键字。若存储过程存在参数,还需向存储过程传递参数。
举个栗子:
set @stuno='108';
call getnum(@stuno,@num);
select @num;
结果:
3.查看存储过程
1.查看所有存储过程的定义:
show procedure status
2.查看某数据库中的所有存储过程名:
select name from mysql.proc where db=‘数据库名’ and type=‘procedure’;
3.查看指定数据库的指定存储过程的详细信息:
show create procedure 存储过程名
4.存储过程的信息保存在information_schema数据库中的routines表中,可以使用select语句查询存储过程的相关信息:
select * from information_schema.routines where routines_name=‘存储过程名’
4.删除存储过程
1.若某个存储过程不再使用,则可以使用drop procedure语句将其删除。
drop procedure 存储过程名
2.当需要修改存储过程的定义时,可使用drop procedure语句暂时将该存储过程删除,再使用create procedure语句重新创建相同名字的存储过程即可。