MySQL 5.0 版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
show procedure status; 查看所有存储过程
show function status; 查看函数
查看存储过程或函数的创建代码
show create procedure proc_name;
show create function func_name;
【definer和invoker的解释】
创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来奉告mysql在执行存储过程的时候,,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。
默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。
DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户'user_name'@'host_name'的权限;
INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
创建一个简单的存储过程
delimiter $$
create procedure test(out r_out text)
begin
select * from admin;
end $$
delimiter;
call test(@r_out);
delimiter :在命令行客户端中,mysql一遇到分号,就要自动执行,需要delimiter换成其它符号,如//或$$。
test(in|out|inout 参数名称 类型(长度))
定义变量
declare a int DEFAULT 2;
declare定义的变量 相当于一个局部变量 在end之后失效,而且declare只能在begin,end中定义。
set @变量名=值
此处的变量不需要声明,mysql会自动根据值类型来确定类型,这种变量要在变量名称前面加上“@”符号,叫做会话变量,
代表整个会话过程他都是有作用的,这个有点类似于全局变量一样
select into 给变量赋值
delimiter $$
create procedure test(inout p text,out p2 text)
begin
select username,phone into p,p2 from admin where id = p;
-- username,phone 分别赋值给了 p,p2
end $$
delimiter ;
调用:
set @p=3
call test(@p,@p2)
select @a as a,@b as b