存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
创建存储过程语法:
delimiter $$
create procedure 过程名称(参数列表 IN | OUT | INOUT)
begin
SQL语句
end $$
delimiter $$
中间SQL语句一般会加入循环和判断的方式来组成一个过程。
查看所有存储过程
show procedure status \G;
查看指定存储过程创建过程
show create procedure proc_name \G;
删除存储过程
DROP PROCEDURE proc_name;
正常一般都是通过工具直接查看吧,有一点是存储过程、函数、视图都是和表一样,创建于当前库的,应该也没人会跑到另一个库建吧。。
调用:
call 存储过程名(参数)
先不用参数,做个简单的实验。
创建一张t1表
create table t1(id int,md5 vachar(50));
再创建一个存储过程,只要调用这个过程就往t1表内插入20条数据。
\d $$
create procedure insert_t1()
BEGIN
declare i int default 1;
while(i<=20)do
insert into t1 values(i,md5(i));
set i=i+1;
end while;
END$$
\d ;
declare:定义变量,i为整数默认值为1,只在这段BEGIN..END中生效
接下来while循环,在mysql中这一行中间不能有空格不然会语法错误
然后调用这个过程看看
call insert_t1();
接下来是存储过程的参数,可以是IN,OUT,INOUT类型,函数的类型只能是IN。
存储过程的参数形式:【IN | OUT | INOUT】参数名 数据类型
IN 输入参数
OUT 输出参数
INOUT 输入输出参数
还是用上面那张表,因为第一个过程里的数值写死了,而正常一段程序里很少会是写死的,用起来很不方便,这样就可以那个数值20改为参数,通过参数传参进去。
\d $$
create procedure insert_t2(IN a int)
BEGIN
declare i int default 1;
while(i<=a)do
insert into t1 values(i,md5(i));
set i=i+1;
end while;
END$$
\d ;
调用这个过程的时候就必须使用它的参数了,不然会报错
正确调用方式,定义的参数类型为整数型,
call insert_t2(10);
在看看参数OUT
这个是输出,还是用t1表实现
\d $$
create procedure insert_t3(OUT total int)
BEGIN
select count(*) INTO total from t1;
END$$
\d ;
先看中间的语句,查询t1表计数并把这个数值赋值给total这个变量里,通过参数OUT传参出来。
如上图,@a本身是没有值的,顺带一提这里可以通过set @a= 赋予它当前会话变量
当然这里没有用到,这里是调用刚创建的存储过程来赋予它变量
CALL insert_t3(@a);
一般传参出来的变量肯定是要给别的地方调用的。
两个一起使用,下面有这样一张表
创建一个存储过程调用就可以得到某个部门的薪水总和并赋予@b。
\d $$
create procedure staff_num1(IN a1 varchar(20),OUT a2 int)
BEGIN
select sum(salary) INTO a2 from staff where post=a1;
END$$
\d ;
最后是INOUT参数,直接建个过程示例
\d $$
create procedure test_inout(INOUT b1 int)
BEGIN
if(b1 is not null)then
set b1=b1+1;
else
select 10 into b1;
end if;
END$$
\d ;
本身@c是空值,所以调用了上面的过程把@C传参进去经过if判断给它赋值了为10,
当再次调用该存储过程后则会满足if判断的另一个条件,自加1