存储过程(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();

 

mysql procedures mysql procedure是什么_mysql procedures

mysql procedures mysql procedure是什么_运维_02

 

接下来是存储过程的参数,可以是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 ;

调用这个过程的时候就必须使用它的参数了,不然会报错

 

mysql procedures mysql procedure是什么_SQL_03

正确调用方式,定义的参数类型为整数型,

call insert_t2(10);

 

mysql procedures mysql procedure是什么_存储过程_04

 

在看看参数OUT

这个是输出,还是用t1表实现

\d $$
create procedure insert_t3(OUT total int)
BEGIN
    select count(*) INTO total from t1;
END$$
\d ;

先看中间的语句,查询t1表计数并把这个数值赋值给total这个变量里,通过参数OUT传参出来。

 

mysql procedures mysql procedure是什么_SQL_05

如上图,@a本身是没有值的,顺带一提这里可以通过set @a= 赋予它当前会话变量

当然这里没有用到,这里是调用刚创建的存储过程来赋予它变量

CALL insert_t3(@a);

 

mysql procedures mysql procedure是什么_运维_06

一般传参出来的变量肯定是要给别的地方调用的。

 

两个一起使用,下面有这样一张表

 

mysql procedures mysql procedure是什么_存储过程_07

创建一个存储过程调用就可以得到某个部门的薪水总和并赋予@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 ;

 

mysql procedures mysql procedure是什么_数据库_08

 

最后是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 ;

 

mysql procedures mysql procedure是什么_mysql procedures_09

本身@c是空值,所以调用了上面的过程把@C传参进去经过if判断给它赋值了为10,

当再次调用该存储过程后则会满足if判断的另一个条件,自加1

 

mysql procedures mysql procedure是什么_数据库_10